2012-08-23 101 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(用十六进制编辑器)

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)只有当您试图读取过去文件结束时变成虚假(即非零值)。这应该解释为什么循环输入比您期望的更多。

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

+1用于解释如何设置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++; 
} 

检查文件的末尾呼吁fread()后immedately或检查返回值fread(),它返回在这种情况下应读取的项目数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不会返回true,除非你读过文件的末尾。在将数组写入二进制文件时,我所做的事情是先写大小,以便知道读取数据时的准确数据量。