声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2659|回复: 5

[综合讨论] 文件指针移动到文件尾,但是feof(fid)却返回0!!

[复制链接]
发表于 2009-7-24 17:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

使用道具 举报

 楼主| 发表于 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
这究竟是怎么回事!!!!!!!!
 楼主| 发表于 2009-7-24 19:00 | 显示全部楼层
问题已经解决!谢谢!
发表于 2009-7-24 19:02 | 显示全部楼层

回复 板凳 tiger1981 的帖子

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

评分

2

查看全部评分

发表于 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 编辑 ]

评分

2

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-6-2 10:01 , Processed in 0.079898 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表