tiger1981 发表于 2009-7-24 17:18

文件指针移动到文件尾,但是feof(fid)却返回0!!

如题,我这样打开文件:fid= fopen(filename,'r'),之后fseek(fid,0,1)或者fseek(fid,0,'eof')
这个时候 feof(fid)应该返回1 但是打开好多文件尝试,都是返回0,而且每次打开新文件之前
都用fclose all或者 fclose(fid)关闭了打开的文件,请各位指教!聚宝盆第八个宝贝没有涉及此问题

tiger1981 发表于 2009-7-24 17:38

此时非常奇怪的现象是
fseek(fid,0,1),x1=ftell(fid); feof(fid)返回0
这时
fread(fid,1,'uchar')
x2 = ftell(fid); feof(fid)返回1,
但是 x1 == x2 返回1
这究竟是怎么回事!!!!!!!!

tiger1981 发表于 2009-7-24 19:00

问题已经解决!谢谢!

friendchj 发表于 2009-7-24 19:02

回复 板凳 tiger1981 的帖子

请把如何解决问题的方法与大家共享一下,ok?

tiger1981 发表于 2009-7-25 11:58

好的!我看大家都不理睬我的帖子,以为这个问题对于大家来说过于简单,大家都不屑一顾呢。
是这样,fseek把文件指针挪到末尾,这个时候,文件指针仍然是有效的!所以feof(fid)返回0。这个时候你仍然可以用fread读它,只不过返回空,如果是'char'或者'uchar',返回' '。如果整型或者单双精度浮点数返回空数组[]。用fread读过之后,这个指针才真正到了文件尾。再深一些的理论我就讲不出来了!
我尝试了许多不同的文件,包括四种格式的binary文件(其中包括一个*.mat文件),也尝试了ASCII文件,都是这样。

ydlcsu 发表于 2009-7-25 14:42

在网上找到的一个关于feof的解释,和C standard有关。
FEOF follows the ANSI C standard that says it does not return true until you read past the end of the file
我的理解是feof实际上是判断fid有没有越过文件结束位。fseek(fid,0,'eof')只是把fid指向了文件结束位并没有越过,所以这个时候foef返回0.如果要feof返回1,就必须要在feof之前调用fread,fgetl之类的命令,让fid越过文件结束位一次。
判断文件是否读完还可以用这个方法,matlab里也提到了
while 1
    tline = fgetl(fid);
    if ~ischar(tline),   break,   end
    disp(tline)
en

[ 本帖最后由 ydlcsu 于 2009-7-25 14:57 编辑 ]
页: [1]
查看完整版本: 文件指针移动到文件尾,但是feof(fid)却返回0!!