[Risolto]Doppia lettura ultima riga di un file di testo

di Anonimizzato16614 il
3 risposte
Salve a tutti.

Ho creato il mio primo programma che dovrebbe leggere i file ad accesso casuale in C seguendo l'esempio del libro, ma il problema è che stampa due volte l'ultima frase.

Ecco il codice sorgente del programma:
#include <stdio.h>
#include <stdlib.h>

struct DatiClienti
{
    int numconto;
    char nome[15];
    char cognome[10];
    float bilancio;
}; //end struct


int main()
{
    printf("LETTURA DA FILE AD ACCESSO CASUALE!\n\n");

    FILE *fPtr; //puntatore a file

    struct DatiClienti clienti = {0,"","",0.0}; //creo variabile che si riferisce a DataClienti con parametri di default

    //apertura del file per la lettura
    if((fPtr = fopen("clienti.dat","rb"))==NULL)
        printf("Errore, impossibile aprire o raggiungere file \a\n\n");
    else
    {
        printf("%-6s%-16s%-11s%10s\n","Num","Nome","Cognome","Bilancio");

        //lettura tramite ciclo while di tutti i record presenti nel file


        while(!feof(fPtr)) //lettura fino alla fine del file
        {
            /*
              1) Puntatore alla variabile che rappresenta la struttura
              2) determinare la dimensione della struttura con sizeof
              3) numero di record letti alla volta --> 1 in questo caso
              4) puntatore al file
            */
            fread(&clienti,sizeof(struct DatiClienti),1,fPtr);

            if(clienti.numconto != 0)//se il numero di conto è diverso da zero stampo i parametri
            {
                printf("\n%-6d%-16s%-11s%10.2f\n",clienti.numconto,clienti.nome,clienti.cognome,clienti.bilancio);
            } //end if
        } //end while

     fclose(fPtr); //chiusura del file

    } //end else



    printf("\n\nLettura file completata!\n\n");
    printf("Premere un tasto per uscire...\n");

    return 0;

} //end main
Ringrazio in anticipo se qualcuno mi saprà dare un consiglio.

3 Risposte

  • Succede perché la condizione di eof viene rilevata solo dopo l'esecuzione della fread.

    Ti consiglio di modificare il codice usando una

    while(1)

    e un controllo sulla fread del tipo

    if(!fread.......) break;
  • Grazie del consiglio.
    Provo a modificare il codice al più presto
  • While(1) significa che cicla sempre
    Poi nel momento in cui eseguo la lettura con fread salvo anche il valore che mi restituisce la funzione che può essere 0(=fine file,problemi hardware...) oppure 1(=OK!).
    Inoltre in questo caso stampo solo i valori che hanno un numero di conto corrente maggiore di zero.

    Ecco il codice sorgente finale:
    
    #include <stdio.h>
    #include <stdlib.h>
    
    struct DatiClienti
    {
        int numconto;
        char nome[15];
        char cognome[10];
        float bilancio;
    }; //end struct
    
    
    int main()
    {
        int ris;
    
        printf("LETTURA DA FILE AD ACCESSO CASUALE!\n\n");
    
        FILE *fPtr; //puntatore a file
    
        struct DatiClienti clienti = {0,"","",0.0}; //creo variabile che si riferisce a DataClienti con parametri di default
    
        //apertura del file per la lettura
        if((fPtr = fopen("clienti.dat","rb"))==NULL)
            printf("Errore, impossibile aprire o raggiungere file \a\n\n");
        else
        {
            printf("%-6s%-16s%-11s%10s\n","Num","Nome","Cognome","Bilancio");
    
            //lettura tramite ciclo while di tutti i record presenti nel file
    
    
            while(1) //ciclo di lettura del file while = 1 -->cicla sempre
            {
    
                /*Lettura del file e restituzione del valore che mi restituisce la funzione fread
                  Se la funzione mi restituisce 1 ==> OK
                  Se mi ritorna 0 ==>fine file,errore hardware...
                */
                ris = fread(&clienti,sizeof(struct DatiClienti),1,fPtr);
    
                if(ris!=1)
                 break; //se il valore è diverso da 1 termino il ciclo con un break
    
                if(clienti.numconto > 0) //se il numero di conto è diverso da zero stampo i parametri
                 printf("\n%-6d%-16s%-11s%10.2f\n",clienti.numconto,clienti.nome,clienti.cognome,clienti.bilancio);
    
            } //end while
    
         fclose(fPtr); //chiusura del file
    
        } //end else
    
        printf("\n\nLettura file completata!\n\n");
        printf("Premere un tasto per uscire...\n");
    
        return 0;
    
    } //end main
    
    
    Grazie e buona domenica!
Devi accedere o registrarti per scrivere nel forum
3 risposte