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

    Problema con feof() e file binari

    Salve a tutti,
    ho due funzioni una di salvataggio su file binario ed una di successiva lettura.
    Il problema è che in fase di lettura, il ciclo for che lavora con la funzione feof() esegue una lettura di troppo, ovvero, l'ultimo elemento del file binario (che come tale è formato da elementi tutti della stessa grandezza) viene letto due volte.

    Per completezza vi allego il codice delle due funzioni:


    Scrittura su file binario:
    codice:
    void salva_binario(FILE *f)
    {
         struct StringPool_TAPPOGGIO appoggio;
         int index;
         int n=0;
         //Finchè non si arriva all'ultima posizione della struttura sp
         for(index=0 ; index<NUMEROMASSIMOELEMENTISP ; index++)
         {
         //Se l'id è diverso da -1 e quindi la posizione è vuota
             if(sp.identifier[index]!=-1)
             {
             //Scrive su file identifier e stringa
                appoggio.identifier = sp.identifier[index];
                strcpy(appoggio.str,sp.str[index]);
                fwrite(&appoggio,sizeof(struct StringPool_TAPPOGGIO),1,f);
                //fwrite(&sp.identifier[index],sizeof(int),1,f);
                //fwrite(sp.str[index],sizeof(char),COST_NUM_CHAR,f);            
                
              }
         }
         fwrite('\0',sizeof(char),1,f);
          
    }
    Lettura da file binario:
    codice:
    void carica_binario(FILE *f)
    {
         int index;
         char appo[COST_NUM_CHAR];
         struct StringPool_TAPPOGGIO appoggio;
         //azzera la struttura sp
         for(index=0 ; index<NUMEROMASSIMOELEMENTISP  ; index++)
         {
             sp.identifier[index]=-1;
             strcpy(sp.str[index],"");        
         }
         //finchè non si arriva alla fine del file binario
         for(index=0; feof(f) == 0; index++)
         {
             //Legge l'identifier e i COST_NUM_CHAR della stringa
             fread(&appoggio,sizeof(struct StringPool_TAPPOGGIO),1,f);  
             sp.identifier[index] = appoggio.identifier;
             strcpy(sp.str[index], appoggio.str);
             //debug
             printf("%d",index);
         }
    }
    Come potete notare nella fuznione di caricamente ho fatto una printf di debug dell'indice che mi stampa quante volte mi esegue il ciclo, ed effettivamente me lo esegue una volta in più e non saprei come risolvere.

    Vi ringrazio in anticipo,
    Neptune.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  2. #2
    feof lo devi di fatto controllare immediatamente dopo la fread, perché il flag di EOF viene effettivamente acceso quando tenti di leggere ma il file è terminato.
    Dovresti anche verificare il valore restituito da fread: se risulta diverso dalle dimensioni dell'elemento da leggere, allora c'è stato un qualche errore di lettura (o banalmente è finito il file).

    Tra parentesi, invece di sizeof(struct StringPool_TAPPOGGIO) ti consiglio di usare sizeof(appoggio): così eviti di scrivere millemila caratteri e ti assicuri di leggere sempre la lunghezza giusta della variabile.
    Amaro C++, il gusto pieno dell'undefined behavior.

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.