求问关于good(),fail()的区别

qq20004604
博客专家认证
2015-12-15 09:10:54
我自己总结了一些,但是不太清楚对不对。

主要是针对在使用ifstream和ofstream这2个类的时候。

——————节选①——————
②fail(),good()的区别,还有bad()等,前两个能用,但是并不知道其到底差别在哪里。还有.eof(),如何区分其用处?
推测是无法读取了,.fail()和.good()会返回true,但不一定是到文件尾了,可能是文件错误等。这个时候.eof()如果返回true,那么的确是到文件尾了。但若返回false,那就是出错了?

——————————————

——————节选②——————
④eof()、good()、对象>>的区别:
假设对象名为 ifstream abc;变量名例如是string类型的变量fff;

————文件名ppp—————
abcdefg
——————————————
这个时候,代码为:
ifstream abc;
abc.open("ppp"); //之所以要加双引号,是因为要和可能的变量名ppp区分开
abc >> fff;

这个时候,若在之后加上代码:
if (!abc.good()) cout << "读取到末尾" << endl;
分析:因为在 abc >> fff;这段代码,已经读取到文件尾了。于是,abc.good()返回的内容是false,加上!则为true,于是输出“读取到末尾”这段话。

若加上的是代码:
if (abc.eof()) cout << "读取到末尾" << endl;
分析:因为abc>>fff已经读取了字符串abcdefg,文件到结尾了,于是abc.eof()的返回值为true(因为编译器在之前的abc>>fff已经检测到了文件尾)。于是if的判断语句为真,执行输出。

若是加上代码
abc >> fff; //这行表示再次读取到变量fff中(注意,之前已经读取到文件尾了,另外fff换成另外一个其他类型的变量也可以)
if (abc.fail()) cout << "读取到文件尾" << endl;
分析:假如没有加入第二段abc>>fff,那么abc.fail()返回值为false。因为加入了第二句abc>>fff,于是,abc.fail()的返回值为true。那么就执行了输出语句。
————————————————



————————节选③——————————
④推断:当能继续读取(未遇见eof,且读取未遇见问题)那么abc.good()将返回true。否则返回false。
A.假设文件内容有两行,第一行abcdefg,第二行空。那么代码:
int fff;
ifstream abc;
abc.open("fff.txt");
abc >> fff;
cout << fff << endl;
if (abc.fail())cout << "abc.fail()返回值为true" << endl;
if (abc.good())cout << "abc.good()返回值为true" << endl;
if (!abc.eof())cout << "abc.eof(返回值为false" << endl;
输出为:
-858993460
abc.fail()返回值为true
abc.eof(返回值为false

原因在于fff为int类型,读取错误的时候,输入流将保留。所以没有读取为eof。

B.假如把int类型改为string类型,那么输出为:
abcdefg
abc.good()返回值为true
abc.eof(返回值为false
原因在于没有读取错误,也没有遇见文件尾。

C.假如在B的基础上,把文件的第二行删除(即使他是空的),只剩下第一行。
那么输出为:
abcdefg
原因在于这个时候,遇见eof了,所以第三行判断代码未通过(注意,前面有一个感叹号);
又因为没有读取通过,所以第一行代码判断未通过;
又因为虽然类型正确,但遇见eof了,所以第二行代码也未通过。

⑤按照说明,方法good()指出最后一次读取输入的操作是否成功。
但根据个人经验,假如读取输入失败,的确good()会返回false,但是若是读取到结尾,也会返回false,即使最后一次读取成功了。如上面④中的C情况。
——————————————————————
...全文
224 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-12-16
  • 打赏
  • 举报
回复
幻夢之葉 2015-12-16
  • 打赏
  • 举报
回复


标志位:
goodbit:就是流状态没有发生错误而且没有到达文件结尾(即以下都没有被置位)
eofbit:文件流到达结尾
badbit:发生了一些不可恢复的错误,一般是比较底层的
failbit:发生了一些逻辑的错误,流一般可以恢复

fail() 函数表示failbit 或者 badbit 被置位了
qq20004604 2015-12-16
  • 打赏
  • 举报
回复
谢谢楼上各位。不过。。就一楼我还能看得懂,后面就基本都看不懂了……

于是,我只能根据自己理解做一个表格了。。。。



64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧