在C ++中,是否有std::ifstream open()
可以成功的情况,但std::ifstream good()
可能是假的?
编辑:使用g ++ 4.7.1进行测试
#include <iostream>
#include <fstream>
int main(int argc, char *argv[])
{
std::ifstream filestream("testfile");
std::cout<<filestream.good()<<std::endl;
std::cout<<filestream.eof()<<std::endl;
std::cout<<filestream.fail()<<std::endl;
std::cout<<filestream.bad()<<std::endl;
return 0;
}
对于空文件,将返回:1,0,0,0,表示good = TRUE
和eof = fail = bad = FALSE
。这是正常的吗?
答案 0 :(得分:3)
在验证标准中的实际文本后,我认为eofbit
之后不允许设置open
:badbit
如果实际打开引发异常则可以设置failbit
(我认为 - 标准并没有说明在这种情况下会发生什么);如果打开失败,或者打开后的搜索(如果设置了ate
)失败,则应设置eofbit
;但似乎没有任何情况可以设置std::istream::good()
。
在这种情况下,不是调用std::istream::good()
是一个很好的解决方案。 (知道OP试图实现的目标会很有趣。无论是什么,调用std::ifstream::good()
可能都不是正确的解决方案。)
如果false
返回true
,则下一个输入将失败。
如果它返回{{1}},则它不会告诉您:下一个输入可能成功,
但它也可能失败。
答案 1 :(得分:2)
如果文件为空,则会触发eofbit,但文件仍然会打开,所以是的。
答案 2 :(得分:1)
ifstream::open
返回无效,因此请注意它的“成功”,请注意您的意思。
该标准适用于basic_ifstream::open
(27.9.1.9):
效果:调用rdbuf() - &gt; open(s,mode | ios_base :: in)。如果那个功能 不返回空指针调用clear(),否则调用 setstate(failbit)(可能会抛出ios_base :: failure)
因此,如果对filebuf的open调用返回一个表示成功的值,那么ifstream::open
将清除所有错误位,因此good()
必须返回true。
如果对filebuf的open调用返回一个表示失败的值,那么ifstream::open
可以返回而不会抛出异常。此行为可能与“成功”混淆,但在这种情况下,good()
返回false,因为已设置failbit。
我并不完全清楚为什么这会设置故障位而不是badbit,但我不认为我缺乏理解会妨碍报告事实: - )