我是否需要调用fstream.close()
或fstream
一个正确的RAII对象来关闭销毁时的流?
我在方法中有一个本地std::ofstream
对象。我可以假设退出此方法后文件总是关闭而不调用close吗?我找不到析构函数的文档。
答案 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是一个很好的做法,因为你需要刷新缓冲区,我被告知了