2012-08-23 6 views
6

Mögliche Duplizieren:
“while(!feof(file))” is always wrongC Lesen Binärdateien

Wenn ich ein Array in die Ausgabedatei schreiben, und ich schließen Sie die Datei, dann wieder die Datei öffnen und alles bis zum Ende gelesen -of-file ist erreicht, obwohl die Datei nur 4 Ziffern enthält, das Programm liest und druckt 5 Ziffern, warum?

Programmausgabe:

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

save.bin (mit einem Hex-Editor)

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

Vielen Dank !!! – Cristi

Antwort

9

feof(fp) wird false (d. H. Wert ungleich Null) nur wenn Sie versucht haben, lesen Vergangenheit das Ende der Datei. Das sollte erklären, warum die Schleife mehr als erwartet eintritt.

Vom 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(). 

Lesen Sie auch die Post: Why is “while (!feof (file))” always wrong?

+3

+1 für die Erklärung, wie 'feof()' gesetzt ist. – hmjd

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

prüfen Ende der Datei immedately nach dem Aufruf von fread() oder überprüfen Sie den Rückgabewert von fread(), die die Anzahl der gelesenen Elemente zurückgibt, die in diesem Fall 1 sein sollte. Eine mögliche Umstrukturierung der Schleife:

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

Nach dem Loopcheck feof() EOF, um sicherzustellen, wurde erreicht und Schleife nicht aufgrund irgendein andere scheitern.

1

ich das gleiche Problem auch haben. Versuchen Sie dies stattdessen:

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

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

Offenbar Feof gibt nicht wahr zurück, es sei denn Sie haben über das Ende der Datei gelesen. Was ich mache, wenn ich Arrays in Binärdateien schreibe, ist, zuerst die Größe zu schreiben, damit ich genau weiß, wie viele Daten ich beim Zurücklesen lesen werde.