7

在 C++ 中,是否存在std::ifstream open()可以成功但std::ifstream good()可以为 false 的情况?

编辑:用 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 = TRUEand eof = fail = bad = FALSE。正常吗?

4

3 回答 3

3

在验证了标准中的实际文本之后,我认为eofbit不允许在open:之后badbit设置,如果实际打开引发异常则可以设置(我认为——标准并没有真正说明在这种情况下应该发生什么) ; 如果打开失败,或者打开后的查找(如果已设置)失败,failbit则应设置;ate但似乎没有任何情况eofbit可以设置。

在这种情况下,调用并不是std::istream::good()一个好的解决方案。(知道 OP 试图实现什么会很有趣。无论如何,调用std::istream::good()可能不是正确的解决方案。)

如果std::ifstream::good()返回false,则下一个输入将失败。如果它返回true,它什么也不告诉你:下一个输入可能会成功,但也可能会失败。

于 2012-09-27T16:58:27.977 回答
2

如果文件为空,则将触发 eofbit,但文件仍将打开,所以是的。

于 2012-09-27T16:57:06.207 回答
1

ifstream::open返回 void,所以要小心你所说的“成功”是什么意思。

该标准对basic_ifstream::open(27.9.1.9)说:

效果:调用 rdbuf()->open(s, mode | ios_base::in)。如果该函数不返回空指针,则调用 clear(),否则调用 setstate(failbit)(可能会抛出 ios_base::failure)

因此,如果对 filebuf 的 open 调用返回一个指示成功的值,则ifstream::open清除所有错误位,因此good()必然返回 true。

如果对 filebuf 的 open 调用返回一个指示失败的值,那么ifstream::open仍然可以返回而不抛出异常。此行为可能与“成功”混淆,但在这种情况下good()返回 false,因为设置了失败位。

我并不完全清楚为什么这会设置故障位而不是故障位,但我不认为我缺乏理解会妨碍报告事实:-)

于 2012-09-27T17:12:03.997 回答