2012-08-23 34 views
6

可能性の重複:私は、出力ファイルに配列を書き込み、私はファイルを閉じる場合は、再度ファイルを開いて、最後まで、すべてを読ん
“while(!feof(file))” is always wrongC読み込むバイナリファイル

ファイルには4つの数字しか含まれていませんが、プログラムは5つの数字を読み取り、印刷しますが、なぜですか?

プログラムの出力:

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

save.bin(16進エディタで)immedately fread()への呼び出し後のファイルの終わりのための

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

ありがとうございます! – Cristi

答えて

9

feof(fp)は、に最後にのファイルの最後を読み取ろうとすると偽(つまりゼロ以外の値)になります。それはなぜループがあなたが期待しているものより1つ多く入っているのかを説明するはずです。 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(). 

また記事を読む:Why is “while (!feof (file))” always wrong?

+3

'feof()'がどのように設定されているかを説明する+1。 – hmjd

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

チェック戻り値をチェックするは、この場合は1である必要がある読み取り項目の数を返します。ループの可能再編:

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

ループチェックfeof()後EOFを確保するためには到達して、ループが他のいくつかの障害が原因で終わりませんでした。

1

は私も同じ問題を抱えています。代わりにこれを試してみてください:

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

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

あなたがファイルの最後を読んでいない限り、明らかにfeofは返しません。バイナリファイルに配列を書き込むときは、最初にサイズを書き込むので、読み返したときに読み取るデータの正確な量を知ることができます。

関連する問題