求问关于good(),fail()的区别
我自己总结了一些,但是不太清楚对不对。
主要是针对在使用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情况。
——————————————————————