Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C] Il famoso problema con feof()

    Ho un albero binario i cui nodi contengono una struttura formata da 4 dati (cognome,nome,indirizzo,telefono). In un file li ho salvati in sequenza, una riga dopo l'altra, e quindi ho un ciclo che ogni 4 inserisce in una struct e passa al metodo inserisci, che inserisce nell'albero.
    L'ultimo file viene inserito due volte, ho già provato a inserire dappertutto l'istruzione if(feof(f)) break; senza ottenere alcun risultato positivo. Dove lo metto? Non valgono le parolacce

    codice:
    int leggi_file(char *fname, TREE *p_T) {
     int flag=0, c1;
    
     SCHEDA sc;
     FILE *f;
    
     f=fopen(fname, "r");
    
     if( f==NULL )
     {
       printf( "Impossibile aprire %s in lettura\n",fname);
       return flag;
     }
     else
     {  
         char buf[50];
         
         while(!feof(f)){
              
            c1=0;
            do
            {  
               if( fgets(buf,50,f)!= NULL ) 
               {          
                 switch(c1) 
                 {
                   case 0:
                     strcpy(sc.cognome,buf);
                     break;
                   case 1:
                     strcpy(sc.nome,buf);
                     break;
                   case 2:
                     strcpy(sc.indirizzo,buf);
                     break;
                   case 3:
                     strcpy(sc.telefono,buf); 
                     break;
                     
        
                 }
                  c1++; 
                  
               }
               if(feof(f))
                 break;
            }while(c1<4);
    
            if(inserisci(&(*p_T),sc))
              flag=1;
            else
             flag=0;
             
                  
         }
         
       if( fclose(f)==EOF ) 
       {
         printf("Errore in chiusura file\n"); 
         flag=0;
         
       }
       flag=1; 
       
       return flag;
     }
    }
    Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Io in genere non testo mai in loop feof. Basta infatti testare se fgets ritorna NULL perché in quel caso vuol dire errore di I/O oppure end-of-file. Poi alla fine del ciclo puoi, se ti serve, anche differenziare tra errore e eof.

    Visto che hai 4 righe "logicamente" raggruppate, le gestisci appunto con uno stato 0 1 2 3. Dopo il 3 si riazzera lo stato e si riparte. Se per caso alla fine del file ti trovi in uno stato diverso da 0, allora potresti anche stabilire che il file è ciucco ...

    Quindi (codice abbreviato):

    codice:
    int stato = 0;
    
    while (fgets (......) != NULL)
    {
        switch (stato)
        {
            case 0:.....
                .....
            case 1:.....
                .....
        }
    
        if (++stato == 4)
        {
            /* tua funzione di inserimento */
            stato = 0;
        }
    }
    
    if (stato != 0)
        /* il file è ciucco */
    ....
    Nota ancora una cosa: fgets inserisce nel buffer, se c'è spazio e la linea è più corta del buffer, il carattere '\n'. Sarebbe meglio toglierlo di mezzo visto che metti le stringhe in una struttura.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Nota ancora una cosa: fgets inserisce nel buffer, se c'è spazio e la linea è più corta del buffer, il carattere '\n'. Sarebbe meglio toglierlo di mezzo visto che metti le stringhe in una struttura.
    Perfetto, ora va alla perfezione

    Perché non va bene avere il '\n' al fondo delle stringhe? C'è qualcosa che tu sai e io no :master:

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da Lasentinella
    Perché non va bene avere il '\n' al fondo delle stringhe? C'è qualcosa che tu sai e io no :master:
    Dipende tutto da cosa ci devi fare con queste stringhe .... comunque in genere sarebbe meglio togliere il \n. Pensa solo se tu volessi stampare a video le 4 stringhe una dietro l'altra, se c'è il \n ti fa andare a capo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

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.