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

di il
3 risposte

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

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

  • Re: [Risolto]Doppia lettura ultima riga di un file di testo

    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;
  • Re: [Risolto]Doppia lettura ultima riga di un file di testo

    Grazie del consiglio.
    Provo a modificare il codice al più presto
  • Re: [Risolto]Doppia lettura ultima riga di un file di testo

    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