可能重复:
我是否需要手动关闭 ifstream?
我是否需要调用fstream.close()
或者是fstream
一个适当的 RAII 对象来关闭销毁流?
我std::ofstream
在方法中有一个本地对象。我可以假设在退出此方法后文件总是关闭而不调用关闭吗?我找不到析构函数的文档。
可能重复:
我是否需要手动关闭 ifstream?
我是否需要调用fstream.close()
或者是fstream
一个适当的 RAII 对象来关闭销毁流?
我std::ofstream
在方法中有一个本地对象。我可以假设在退出此方法后文件总是关闭而不调用关闭吗?我找不到析构函数的文档。
我认为以前的答案具有误导性。
fstream
是一个适当的 RAII 对象,它会在范围结束时自动关闭,并且在范围结束时关闭就足够了,绝对不需要手动调用。close
特别是,这不是“最佳实践”,也没有必要刷新输出。
虽然 Drakosha 是对的,调用close
使您可以检查流的失败位,但无论如何没人这样做。
在理想的世界中,人们会简单地事先调用并处理在析构函数stream.exceptions(ios::failbit)
中抛出的异常。fstream
但不幸的是,析构函数中的异常在 C++ 中是一个被破坏的概念,所以这不是一个好主意。
因此,如果您想检查关闭文件是否成功,请手动进行(但仅在那时)。
要附加到 Amy Lee 的答案,最好手动执行,因为这样您也可以检查错误。
顺便说一句,根据“关闭”手册页:
不检查 close() 的返回值是一个常见但严重的编程错误。上一次 write(2) 操作的错误很有可能在最后的 close() 中首先报告。关闭文件时不检查返回值可能会导致数据无声丢失。这在 NFS 和磁盘配额中尤其明显。
成功关闭并不能保证数据已成功保存到磁盘,因为内核延迟写入。文件系统在流关闭时刷新缓冲区并不常见。如果您需要确保数据是物理存储的,请使用 fsync(2)。(此时这将取决于磁盘硬件。)
我认为关闭你的 fstream 是一个好习惯,因为你需要刷新缓冲区,我被告知