成功打开但效果不佳

Successfully open but not good?

本文关键字:成功      更新时间:2023-10-16

在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 = TRUEeof = 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,因为设置了故障位。

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