fmlp Posted June 14, 2012 at 12:59 AM Report Share #462611 Posted June 14, 2012 at 12:59 AM (edited) 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 June 14, 2012 at 09:02 AM by pmg GeSHi adicionado Link to comment Share on other sites More sharing options...
pikax Posted June 14, 2012 at 08:22 AM Report Share #462617 Posted June 14, 2012 at 08:22 AM 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 More sharing options...
pmg Posted June 14, 2012 at 09:12 AM Report Share #462626 Posted June 14, 2012 at 09:12 AM 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 More sharing options...
fmlp Posted June 14, 2012 at 01:26 PM Author Report Share #462761 Posted June 14, 2012 at 01:26 PM (edited) 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 June 14, 2012 at 01:27 PM by fmlp Link to comment Share on other sites More sharing options...
pmg Posted June 14, 2012 at 01:41 PM Report Share #462776 Posted June 14, 2012 at 01:41 PM 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 More sharing options...
KTachyon Posted June 14, 2012 at 02:18 PM Report Share #462798 Posted June 14, 2012 at 02:18 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now