76

可能重复:
我是否需要手动关闭 ifstream?

我是否需要调用fstream.close()或者是fstream一个适当的 RAII 对象来关闭销毁流?

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

4

3 回答 3

122

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

fstream 一个适当的 RAII 对象,它在范围结束时自动关闭,并且在范围结束时关闭就足够了,绝对不需要手动调用。close

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

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

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

因此,如果您想检查关闭文件是否成功,请手动进行(但仅在那时)。

于 2011-01-26T08:31:07.810 回答
6

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

顺便说一句,根据“关闭”手册页

不检查 close() 的返回值是一个常见但严重的编程错误。上一次 write(2) 操作的错误很有可能在最后的 close() 中首先报告。关闭文件时不检查返回值可能会导致数据无声丢失。这在 NFS 和磁盘配额中尤其明显。

成功关闭并不能保证数据已成功保存到磁盘,因为内核延迟写入。文件系统在流关闭时刷新缓冲区并不常见。如果您需要确保数据是物理存储的,请使用 fsync(2)。(此时这将取决于磁盘硬件。)

于 2011-01-26T08:27:04.627 回答
2

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

于 2011-01-26T08:23:16.733 回答