我有,可能是微不足道的问题,但我无法理解.我写了简单的代码:
fstream file;
file.open("data", ios::in);
if(!file.good()){
file.close();
file.open("data", ios::out);
if(!file.good()) cout<<"not good"<<endl;
file<<"test"<<endl;
file.close();
}
Run Code Online (Sandbox Code Playgroud)
在新的VS8 C++ Express项目中.当我运行它并且"data"不存在时,它会创建文件,但也会返回"not good"(第二个),因此输出不会写入文件中.现在来了有趣的事情.如果我在VS10 C++ Express和Code :: Blocks 12中编译相同的代码,它可以正常工作.
为什么会这样?
@edit我的朋友在他的电脑上用VS8 C++ Expres检查了它.对他来说也一样.
@ edit2与我对"解决方案"的评论相同:
强制使用.clear()清除failbit; 方法似乎工作.当您在较新的IDE中学习然后必须切换到较旧的IDE时会很痛:/.所以,它给了很好的教训.多谢你们.
这是设计使然。在 C++98 中,关闭 fstream 不会清除错误状态,并且调用open()fstream 不会重置错误状态。有关该问题的讨论,请参阅LWG Defect #409 。
clear()C++11 中的行为已更改,如果打开操作成功,则错误状态会被清除(通过调用)。