VS8无法处理file.close(); file.open();,为什么?

时间:2013-06-11 20:01:37

标签: c++

我有,可能是微不足道的问题,但我无法理解。 我写了简单的代码:

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();
}

在新的VS8 C ++ Express项目中。当我运行它并且“data”不存在时,它会创建文件,但也会返回“not good”(第二个),因此输出不会写入文件中。现在来了有趣的事情。如果我在VS10 C ++ Express和Code :: Blocks 12中编译相同的代码,它可以正常工作。

为什么会这样?

@edit 我的朋友在他的电脑上用VS8 C ++ Expres检查了它。对他来说也一样。

@ edit2与我对“解决方案”的评论相同:

  

强制使用.clear()清除failbit;方法似乎工作。好痛   当您在较新的IDE中学习然后必须切换到较旧的IDE时:/。   那,它给了很好的教训。谢谢你们。

1 个答案:

答案 0 :(得分:4)

这是设计的。在C ++ 98中,关闭fstream不会清除错误状态,并且在fstream上调用open()不会重置错误状态。有关该问题的讨论,请参阅LWG Defect #409

在C ++ 11中更改了行为,以便在打开操作成功时清除错误状态(通过调用clear())。