我需要关闭std :: fstream吗?

时间:2011-01-26 08:21:06

标签: c++ std fstream ofstream

  

可能重复:
  Do I need to manually close a ifstream?

我是否需要调用fstream.close()fstream一个正确的RAII对象来关闭销毁时的流?

我在方法中有一个本地std::ofstream对象。我可以假设退出此方法后文件总是关闭而不调用close吗?我找不到析构函数的文档。

3 个答案:

答案 0 :(得分:82)

我认为之前的答案具有误导性。

fstream 一个正确的RAII对象, 在范围的末尾自动关闭,并且绝对不需要任何< 在范围结束时关闭时手动调用close就足够了。

特别是,它不是“最佳实践”,也没有必要刷新输出。

虽然Drakosha是正确的,但调用close可以检查流的失败位,无论如何都没有人这样做。

在一个理想的世界中,人们只需事先调用stream.exception(ios::failbit)并处理fstream析构函数中抛出的异常。但不幸的是,析构函数中的异常在C ++中是一个破碎的概念,所以这不是一个好主意。

所以如果你要检查关闭文件是否成功,请手动执行(但仅限于此)。

答案 1 :(得分:5)

要附加到Amy Lee的答案,最好手动执行,因为这样你也可以检查错误。

BTW,根据"close" manpage

  

不检查返回值   close()虽然很常见但是很常见   严重的编程错误。这十分的   可能是以前的错误   写(2)操作首先报告   在最后收盘()。不检查   关闭文件时可以返回值   导致数据无声丢失。这个可以   特别是用NFS和   有磁盘配额。

     

成功结束不保证   数据已经成功   保存到磁盘,就像内核推迟的那样   写道。对于a来说并不常见   文件系统在刷新缓冲区时   流已关闭。如果你需要   确保数据是物理的   存储使用fsync(2)。 (这取决于   此时在磁盘硬件上。)

答案 2 :(得分:1)

我认为关闭你的fstream是一个很好的做法,因为你需要刷新缓冲区,我被告知了