免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: hawk2012
打印 上一主题 下一主题

[C++] 请教:c++中读文件,如何判断文件结尾 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-02-09 14:46 |只看该作者
stat(2) 是系统调用,平台相关

论坛徽章:
0
12 [报告]
发表于 2007-02-09 15:02 |只看该作者
原帖由 hawk2012 于 2007-2-9 13:59 发表
ls:
通过使用你给的那段代码,我发现,是可以正常的读取到文件结尾的,那么看来eof这个函数是没有问题.
我把in.read修改为in.getline结果程序没有读到文件结尾就跳出了,所以我觉得是in.getline()在使用时候的问题. ...


你说的是哪个字符阿?

论坛徽章:
0
13 [报告]
发表于 2007-02-09 21:30 |只看该作者
在这里有关于 std::istream::getline 成员函数的说明:
http://www.cplusplus.com/reference/iostream/istream/getline.html

可以注意到 failbit 标志被置位的两种情况:其一是文件结束,其二是文件中一行的字符数大于 n-1(其中 n 是你为此函数提供的缓冲区的长度)。正是第二种情况造成程序中的错误,因为你没有对此情况进行相应的处理。

在标准库中还有一个全局 getline 函数(在<string>中定义),它没有上面的第二种情况的限制,所以一般应该优先这个全局函数,处理起来较上面的成员函数要方便。

在用 eof 函数判断文件结尾的时候,一定要在读文件操作之后、而不是象你的程序中那样在读文件操作之前进行。一般情况下使用 std::istream 来操作文件没有必要用 eof 判断结尾。

这里提供了一个获得文件大小的例子,是用 std::istream::seekg 来实现的:http://www.cplusplus.com/reference/iostream/istream/seekg.html

论坛徽章:
0
14 [报告]
发表于 2008-06-04 19:33 |只看该作者
这个好像与刚才提问的有点关系!

论坛徽章:
0
15 [报告]
发表于 2008-06-04 21:14 |只看该作者
看来你调试的够仔细,适合做测试人员

论坛徽章:
0
16 [报告]
发表于 2012-03-07 21:55 |只看该作者
问题就出在: in.getline(p, sizeof(p))
该函数的解释中有这样一句: If the function stops reading because this size is reached, the failbit internal flag is set.
就是说: 当FILE_NAME_IN文件的某行数据长度大于sizeof(p)的时候, failbit就会被设置。导致到达不了文件结尾。

处理方法: 把"sizeof(p)"替换为一个比较大的数,即至少大于FILE_NAME_IN文件中字符数最大的行。 然后再做后续处理
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP