std :: ofstream对象无法正常关闭的原因是什么?

时间:2010-10-30 13:36:23

标签: c++ ifstream standard-library ofstream file-manipulation

我注意到在我的C ++代码中,无论何时关闭std::ofstream对象,我都无法重新打开我用std::ifstream关闭的文件。 std::ifstream的{​​{1}}函数将始终失败。

我能做些什么'额外'来确保我的std :: ofstream对象正确关闭?

有人可能会要求查看我的具体代码,所以为了保持这个帖子的小,我已经把它贴了here。在运行案例a或d后,我的代码中所有open开放调用都失败了。 (在发布此问题之前,我有几个人玩我的代码除了std::ifstream因未知原因关闭失败之外无法得出任何结论)

提前感谢收到的所有回复。

代码是

std::ofstream

1 个答案:

答案 0 :(得分:3)

确保在此处理中的每个点重置流的最佳方法不是显式关闭它们,而是在使用点声明它们并允许它们超出范围。这是评论中提出的RAII点。在您的情况下,这意味着将声明从函数顶部移动到交换机的每个臂内部。通过这种方式,您可以确保在退出特定case时完全关闭每个文件,因为ofstream和ifstream在范围退出时销毁期间关闭文件。

我注意到的另一件事是你在文件打开后测试一个奇怪的东西:

 fin.open("address.txt");
 if(!fin)

这测试了一个糟糕的流,但我不认为它是完整的 - 如果你正在测试成功打开,你还应该测试

 fin.open("address.txt");
 if (!fin.is_open())

所有文件处理循环和open()调用都需要检查fin.fail()fout.fail()以及fin.eof(),以排除文件访问错误为未处理的条件这会混淆你观察到的行为。

此时,我建议你解决这些明显的误解,如果你无法解决这些问题,请回过头来提出更具体的问题。