成功打开但效果不佳
Successfully open but not good?
在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,因为设置了故障位。
我不完全清楚为什么这会设置失败位而不是坏位,但我认为我缺乏理解并不妨碍报告事实:-)
- cmake在我的项目中所需的所有静态库都不成功
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- 如何让LLDB在成功时退出,在失败时等待
- 有没有办法知道Tracer是否成功地完全连接到了jaegerclientcpp中的jaeger后端服务器
- CMake WxWidgets项目成功地在Linux上构建,但没有在Windows上构建
- 为什么 std::绑定错误参数可以成功?
- Clion显示错误,但可以使用Cmake成功构建代码
- 代码使用向量成功运行,但使用数组显示错误
- 如何检查cURL是否成功登录?c ++
- 为什么 WinInet 在通过 FQDN 连接时无法通过协商自动进行身份验证,但如果通过 IP 连接则成功?
- C++为什么我的编译器成功了,但我的计算机给出了调试错误?
- 未知的 GCC 链接器错误,但已成功构建
- 我的 SonarQube C++扫描成功,但结果仅标记重复项,而没有标记其他标记的位置
- 为什么 LoadLibrary 失败,而 LoadLibraryA 成功加载 DLL?
- 生成成功,但不会给出正确的输出
- 默认/样板代码在Visual Studio 2017中给我错误.E1574.虚幻.但构建成功了
- 即使不包含其标头,如何成功向前声明的类编译?
- C++成功复制动态分配的 obj 而不复制 ctor?
- VS2017 版本 15.8.3 成功编译内联方法,而不返回所需值
- 为什么我无法成功运行以下刽子手游戏机代码?我可以在 devc++ 中成功运行相同的代码