功能:检测流上的文件结束符。如果文件结束,则返回非0值,否则返回0,文件结束符只能被clearerr()清除。
正确的应该是feof返回0表示文件没有结束,返回1,表示结束。
feof实际观察的是上次读操作的内容,也就是上次读操作fread返回的值,如果读操作的返回值表明读取的不是空,那feof就返回0,如果上次读操作失败了,则feof返回1,表示读取完了。而fread返回值是表示正确读取的块数,如果不够,则返回0。那么我们看一下下面的程序:
while(1){
if(feof(fp1))
{
break;
}
tmpint=fread(&(tmp[k]),1,1,fp1);
k++;
}
如果fp1指向的文件有256个字节,那么运行结束后,k的值为257。原因是由于在fread读取k=255的时候,文件其实就应该完了,但是fread在k=255这次读取中,其返回值是1,因此进入k=256循环后,feof仍然返回的是0。因此k++也会再执行一次,因此,k变成了257。当进入k=257循环内,feof发现上次读操作失败了,因为上次fread返回了0,此刻break。最后k=257,比实际的文件大小大了一。所以在用feof的时候要多多注意。
时间: 2024-10-18 22:41:18