Jump to content

Função em c com fgets não lê mais que a 1ª linha


fmlp

Recommended Posts

void carrega_jogos(LJOG lista, LEQUI lista2)
{
   char dia[2], mes[2], ano[4], pont1[2], pont2[2], nome1[30], nome2[30];
   FILE * p;
   int i, j=0, flag=0, count=0, k=0;
   JOGOS jog;
   p=fopen("jogos.txt", "r");
   char *str;
   str= (char *) malloc(100*sizeof(char));
   while(fgets(str,100,p)!=NULL)
   {
       printf("str:%s\n", str);
       jog = (JOGOS) malloc (sizeof (jogos));
       j+=1;
       count=0;
       k=0;
       for (i=0; i<strlen(str); i++)
       {
           flag=0;
           if (str[i]=='|')
           {
               if (count==0)
                   nome1[k]='\0';
               else if (count==1)
                   nome2[k]='\0';
               else if (count==2)
                   dia[k]='\0';
               else if (count==3)
                   mes[k]='\0';
               else if (count==4)
                   ano[k]='\0';
               else if (count==5)
                   pont1[k]='\0';
               else if (count==6)
                   pont2[k]='\0';
               count+=1;
               flag=1;
               k=-1;
           }
           if (count ==0 && flag==0)
               nome1[k]=str[i];
           else if (count==1 && flag==0)
               nome2[k]=str[i];
           else if (count==2 && flag==0)
               dia[k]=str[i];
           else if (count==3 && flag==0)
               mes[k]=str[i];
           else if (count==4 && flag==0)
               ano[k]=str[i];
           else if (count==5 && flag==0)
               pont1[k]=str[i];
           else if (count==6 && flag==0)
               pont2[k]=str[i];
           k+=1;
       }
       jog->equi1 = pesquisa_equi_nome(lista2, nome1);
       jog->equi2 = pesquisa_equi_nome(lista2, nome2);
       jog->data.dia = atoi(dia);
       jog->data.mes = atoi(mes);
       jog->data.ano = atoi(ano);
       jog->eq1p = atoi(pont1);
       jog->eq2p = atoi(pont2);
       jog->id=j;
       printf("Jogo n%d:\n%s \n%s \ndata:%d-%d-%d\n->%d\n->%d\n",jog->id, jog->equi1->nome, jog->equi2->nome, jog->data.dia, jog->data.mes, jog->data.ano, jog->eq1p, jog->eq2p);
       ins_jogos(lista, jog);
   }
   fclose(p);
}

toda a função aplicada a um programa principal funciona bem... na 1ª execução pois na 2ª execução o fgets nem copia para o str a 2ª linha do ficheiro... o que realmente se passa?

Edited by pmg
GeSHi adicionado
Link to comment
Share on other sites

antes de mais nada da uma olhadela aqui

https://www.portugal-a-programar.pt/topic/6931-tutorial-como-utilizar-o-geshi-codigo-colorido/

Mete tambem o ficheiro jogos.txt

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

Não sei porque é que o ciclo só corre uma vez, assumindo que o ficheiro tem duas linhas ou mais.

Precisas de dar mais informação ...

Mas tenho um ponto a levantar: onde estão os free() correspondentes aos malloc()s?

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

V. Guimaraes|Rio Ave|15|2|2012|2|0|
Academica|Benfica|25|3|2012|2|0|

o ficheiro jogos.txt tem este conteudo, na segunda execução do ciclo nem sequer copia para str a 2ª linha... é bastante estranho isto acontecer

e quanto ao free este é feito no final do programa visto que não o posso fazer na execução pois aquilo é colocado numa lista ligada

Edited by fmlp
Link to comment
Share on other sites

O teu código, com ligeiras alterações, corre perfeitamente bem com o teu input, no ideone: http://ideone.com/umGFT

#include <stdio.h>
#include <stdlib.h>

int main(void) {
   FILE *p;
   char *str;
   int lineno = 0;

   p = stdin;
   str = malloc(100);
   if (!str) {
       fprintf(stderr, "no memory\n");
       exit(EXIT_FAILURE);
   }
   while (fgets(str, 100, p) != NULL) {
       printf("%d ==> str: %s", ++lineno, str); /* \n is already part of str */
   }
   free(str);
   return 0;
}

Nota a linha assinalada, verificando se a alocação de memória funcionou.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Confirma se o ficheiro não utiliza \r como delimitador de linha, em vez de \n ou \r\n. Pode acontecer se tiver sido criado num Mac com o sistema operativo dos anos 90, ou com o Excel para Mac, que ainda exporta CSVs com as linhas delimitadas com \r.

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.