我需要closures一个std :: fstream吗?
可能重复:
我需要手动closures一个ifstream吗?
我需要调用fstream.close()
还是fstream
一个适当的RAII对象,closures销毁的stream?
我有一个方法内的本地std::ofstream
对象。 我可以假定文件在退出这个方法后总是closures而不需要调用close? 我找不到析构函数的文档。
我认为以前的答案是误导。
fstream
是一个合适的RAII对象,它在范围的末尾自动close
,当范围的末尾closures时,完全没有必要手动调用close
。
特别是,这不是“最佳做法”,不需要刷新输出。
虽然Drakosha是正确的调用close
可以检查stream的失败位,但无论如何,没有人这样做。
在一个理想的世界中,可以事先简单地调用stream.exception(ios::failbit)
并处理抛出在fstream
的析构函数中的exception。 但不幸的是,析构函数中的exception在C ++中是一个破碎的概念,所以这不是一个好主意。
所以, 如果你想检查closures文件的成功,手动(但只有这样)。
要附加到艾米李的答案,最好手动做,因为这样你也可以检查错误。
顺便说一句,根据“closures”的手册 :
不检查close()的返回值是一个常见但严重的编程错误 。 先前的write(2)操作的错误很可能会在最后的close()中被首先报告。 在closures文件时不检查返回值可能会导致数据无提示丢失。 这尤其可以通过NFS和磁盘配额来观察。
成功closures并不能保证数据已成功保存到磁盘 ,因为内核推迟写入。 当streamclosures时,文件系统刷新缓冲区并不常见。 如果您需要确保数据是物理存储的,请使用fsync(2)。 (这点取决于硬盘硬件。)
我认为这是一个很好的做法,closures你的fstream,因为你需要冲洗缓冲区,我所知道的