Visto che ieri siete stati così gentile, ne approfitto![]()
Devo leggere da un file un'elenco di parole e creare una lista di struct conteneti la parola e il numero di volte che questa compare nell'elenco. Poi devo stampare il tutto.
Ho fatto il programmino però l'ultima parola viene letta due volte e non ne capisco il motivo. Ho allegato il file parole.c al messaggio. Il file da leggere è del tipo:
gatto
cane
pesce
cinghiale
pesce
fringuello
cane
cinghiale
toro
topo
Forse non si può allegare il file .c quindi lo metto qua
codice:#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct _WORD{ char *parola; int num; struct _WORD *next; } WORD; WORD *head=NULL; void AddUpdate(char *parola); void Add(char *parola); void PrintList(); void Update(WORD *W); int main(int argc, char *argv[]){ FILE *fpin; char tmp[80+1]; int len; if((fpin=fopen(argv[1], "r")) == NULL ){ printf("Errore apertura file %s", argv[1]); } while(!feof(fpin)){ fgets(tmp, 80, fpin); AddUpdate(tmp); } PrintList(); } void AddUpdate(char *parola){ WORD *W; int i, flag=0; for(W=head; W!=NULL; W=W->next){ if(strcmp(W->parola, parola)==0){ Update(W); flag=1; } } if(flag==0){ Add(parola); } } void Add(char *parola){ WORD *W; W=malloc(sizeof(WORD)); W->num=1; W->parola=strdup(parola); /*Inserimento in testa*/ W->next=head; head=W; } void Update(WORD *W){ W->num++; } void PrintList() { WORD *W=head; while(W!=NULL){ printf("%s", W->parola); printf("%d\n", W->num); W=W->next; } }

 
					
					
					
						
  Rispondi quotando
 devi controllare feof subito dopo fgets e non dopo aver stampato la stringa, infatti tieni presente che feof ritorna true non quando sei arrivato alla fine del file ma dopo il primo tentativo di leggere oltre la fine del file. In effetti questa cosa crea il piu' delle volte confusione comunque una volta imparata la lezione non ci sono piu' problemi.
						