在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
。正常吗?
在验证标准中的实际文本后,我认为不允许在open
后设置eofbit
:如果实际打开抛出异常,可能会设置badbit
(我认为 - 标准并没有真正说明在这种情况下应该发生什么); 如果打开失败,或者打开后的搜索(如果设置了ate
)失败,则应设置failbit
;但似乎没有任何可以设置eofbit
的情况。
在这种情况下,调用std::istream::good()
并不是一个好的解决方案。 (了解OP试图实现的目标会很有趣。 不管是什么,打电话给std::istream::good()
可能不是正确的解决方案。
如果std::ifstream::good()
返回false
,下一个输入将失败。如果它返回 true
,它什么也没告诉你:下一个输入可能会成功,但它也可能失败。
如果文件为空,将触发 eofbit,但文件仍将打开,所以是的。
ifstream::open
返回 void,所以要小心你说它"成功"的意思。
该标准对basic_ifstream::open
(27.9.1.9)说:
效果:调用 rdbuf()->open(s, mode | ios_base::in)。如果该功能 不返回空指针调用 clear(),否则调用 setstate(failbit)(可能会抛出ios_base::failure)
因此,如果在 filebuf 上打开的调用返回一个指示成功的值,则ifstream::open
清除所有错误位,因此good()
必然返回 true。
如果在 filebuf 上打开的调用返回一个指示失败的值,则ifstream::open
仍然可以返回而不会引发异常。此行为可能会与"成功"混淆,但在这种情况下,good()
返回 false,因为设置了故障位。
我不完全清楚为什么这会设置失败位而不是坏位,但我认为我缺乏理解并不妨碍报告事实:-)