2012-08-23 11 views
6

Powiel możliwe:
“while(!feof(file))” is always wrongC czyta pliki binarne

Jeśli piszę tablicę do pliku wyjściowego i zamknij plik, a następnie otwórz ponownie plik i przeczytać wszystko do końca -of-plik zostanie osiągnięty, chociaż plik zawiera tylko 4 liczby, program odczyta i wydrukuje 5 liczb, dlaczego?

wyjście Program:

a[0] = 4 
a[1] = 7 
a[2] = 12 
a[3] = 34 
a[4] = 34 

save.bin (w edytorze hex)

04000000 07000000 0C000000 22000000 

#include <stdio.h> 
#include <stdlib.h> 
#define path "save.bin" 

int main(void) 
{ 
    FILE *f=NULL; 
    int a[]={4,7,12,34},i,n=4,k; 
    f=fopen(path,"wb"); 
    if(f==NULL) 
    { 
    perror("Error"); 
    exit(1); 
    } 
    for(i=0;i<n;i++) // or I could use fwrite(a,sizeof(int),n,f); 
    fwrite(&a[i],sizeof(int),1,f); 
    fclose(f); 
    f=fopen(path,"rb"); 
    if(f==NULL) 
    { 
    perror("Error"); 
    exit(1); 
    } 
    i=0; 
    while(!feof(f)) 
    { 
    fread(&k,sizeof(int),1,f); 
    printf("a[%d] = %d\n",i,k); 
    i++; 
    } 
    printf("\n"); 
    fclose(f); 
    return 0; 
} 
+0

Dziękuję bardzo !!! – Cristi

Odpowiedz

9

staje się fałszywy (to znaczy niezerowa wartość) tylko wtedy, gdy próbujesz uzyskać odczytać koniec końca pliku. To powinno wyjaśniać, dlaczego pętla jest wprowadzana o jeden więcej, niż można się spodziewać.

Z documentation:

The function feof() tests the end-of-file indicator for the stream 
    pointed to by stream, returning nonzero if it is set. The end-of- 
    file indicator can be cleared only by the function clearerr(). 

przeczytać również stanowisko: Why is “while (!feof (file))” always wrong?

+3

+1 dla wyjaśnienia, jak ustawione jest 'feof()'. – hmjd

1
while(!feof(f)) 
{ 
    fread(&k,sizeof(int),1,f); 
    printf("a[%d] = %d\n",i,k); /** THIS ASSUMES fread() WAS SUCCESSFUL. **/ 
    i++; 
} 

Sprawdź na końcu pliku immedately po wywołaniu fread() lub sprawdź wartość zwracaną fread(), który zwraca liczbę odczytanych elementów, która w tym przypadku powinna być 1. Ewentualna restrukturyzacja pętli:

while(1 == fread(&k,sizeof(int),1,f)) 
{ 
    printf("a[%d] = %d\n",i,k); 
    i++; 
} 

Po sprawdzeniu pętli feof() celu zapewnienia EOF został osiągnięty i pętla nie skończyła z powodu jakiejś innej awarii.

1

Mam ten sam problem, jak również. Spróbuj zamiast tego:

i=0; 
    while(true) 
    { 
    fread(&k,sizeof(int),1,f); 
    if(feof(f)) 
     break; 

    printf("a[%d] = %d\n",i,k); 
    i++; 
    } 

Wygląda na to, że nie zwraca true, chyba że przeczytałeś koniec pliku. To, co robię, pisząc tablice do plików binarnych, to najpierw zapisać rozmiar, więc znam dokładną ilość danych, które przeczytam, czytając z powrotem.

Powiązane problemy