如果我将数组写入输出文件并关闭文件,则再次打开文件并读取所有文件,直到文件结束,尽管文件只包含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 :(得分:9)
feof(fp)
才会变为false(即非零值)。这应该可以解释为什么循环输入比你预期的多一个。
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().
答案 1 :(得分:1)
while(!feof(f))
{
fread(&k,sizeof(int),1,f);
printf("a[%d] = %d\n",i,k); /** THIS ASSUMES fread() WAS SUCCESSFUL. **/
i++;
}
在调用fread()
后立即检查文件结尾或检查fread()
的返回值,该值返回读取的项目数,在这种情况下应为1
。可能的循环重组:
while(1 == fread(&k,sizeof(int),1,f))
{
printf("a[%d] = %d\n",i,k);
i++;
}
循环检查feof()
以确保达到EOF并且由于某些其他故障而导致循环未结束。
答案 2 :(得分: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,除非你已经读过文件的末尾。在将数组写入二进制文件时,我所做的就是首先写入大小,所以我知道在阅读它时我将要读取的确切数据量。