Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    49

    [C]Lettura da file e liste

    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;
    	}
    }

  2. #2
    Questo e' classico 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.

    Ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    49
    Grazie!
    E' proprio un classico, cercando meglio l'ho trovato anche qui .

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.