我需要关闭一个std :: fstream吗?

问题描述:

可能重复:
Do I need to manually close a ifstream?我需要关闭一个std :: fstream吗?

我需要调用fstream.close()或者是fstream适当RAII对象,逢破坏流?

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

+0

是的,它是重复的。谢谢。我没有找到它。 – 2011-01-26 08:33:00

+3

不完全重复。引用的问题特定于ifstreams,而这个问题通常是关于fstreams的。 – 2012-10-15 16:41:22

我认为以前的答案是误导性的。

fstream适当RAII对象,它在范围的结束确实自动关闭,也绝对完全不需要在作用域结束时关闭时,足以手动调用close

特别是,这不是“最佳实践”,也不需要刷新输出。

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

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

所以如果你想检查关闭文件的成功,手动(但只有然后)。

我认为这是一个很好的做法,关闭fstream的,因为你需要刷新缓冲区,这就是我一直告诉

+5

如果fstream是一个RAII对象,它将被关闭,因此无论如何都会刷新缓冲区。主要问题是我是否需要在所有控制流上进行错误处理以确保它被刷新。 – 2011-01-26 08:31:13

+4

对不起,-1仅仅因为它以某种方式有+2。手动发布资源或者是糟糕的编程标志,或者是对容器目的的误解。 – GManNickG 2011-01-26 08:34:40

追加到艾米李的回答,这是更好地做手工,因为这样你也可以检查错误。

BTW,根据"close" manpage

不检查 密切的返回值()是一种常见但仍然 严重的编程错误。这是很 可能是在以前 写错误(2)操作中首次报道 在最后的close()。关闭文件时不检查 返回值可能会导致数据的无提示丢失 。这可以通过NFS和 以及磁盘配额来观察,尤其是 。

一个圆满的句号并不保证 该数据已成功 保存到磁盘,因为内核推迟 写道。当 流被关闭时, 文件系统刷新缓冲区并不常见。如果您需要 请确保数据在物理上是 存储使用fsync(2)。 (这一点取决于磁盘硬件上的 )。