std :: fstreamを閉じる必要がありますか? [複製
質問
可能な複製:
ifstreamを手動で閉じる必要がありますか?
電話する必要がありますか fstream.close()
またはそうです fstream
破壊時にストリームを閉じる適切なRAIIオブジェクト?
地元の人がいます std::ofstream
メソッド内のオブジェクト。閉じることなくこの方法を終了した後、ファイルは常に閉じられていると仮定できますか? Destructorのドキュメントが見つかりませんでした。
解決
以前の答えは誤解を招くと思います。
fstream
は 適切なRAIIオブジェクト、それ します スコープの最後に自動的に閉じると、絶対にあります まったく必要ありません 電話する close
スコープの最後に閉じるときは手動で十分です。
特に、それは「ベストプラクティス」ではなく、出力をフラッシュする必要はありません。
そして、Drakoshaはその呼び出しです close
ストリームの失敗ビットをチェックする可能性をあなたに与えます、とにかく誰もそれをしません。
理想的な世界では、単に電話することになります stream.exception(ios::failbit)
事前にスローされる例外を処理します fstream
's Destructor。しかし、残念ながら、デストラクタの例外はC ++の壊れた概念であるため、それは良い考えではありません。
そう もしも ファイルを閉じることの成功を確認し、手動で実行します(ただし、その時だけ)。
他のヒント
エイミー・リーの答えに追加するには、エラーもチェックできるので、手動でそれを行う方が良いでしょう。
ところで、によると 「閉じる」マンページ:
close()の返品値をチェックしないことは一般的ですが、それにもかかわらず深刻なプログラミングエラーです. 。以前の書き込み(2)操作のエラーが最後のClose()で最初に報告される可能性は非常に高いです。ファイルを閉じるときに返品値をチェックしないと、データがサイレント損失につながる可能性があります。これは、特にNFSおよびディスククォータで観察できます。
成功したクローズは、データがディスクに正常に保存されたことを保証するものではありません, 、カーネルの式が書いているように。ファイルシステムがストリームが閉じたときにバッファーをフラッシュすることは一般的ではありません。データが物理的に保存されていることを確認する必要がある場合は、FSYNC(2)を使用します。 (この時点でディスクハードウェアに依存します。)
私があなたのfstreamを閉じることは良い習慣だと思います。私が言われたことをバッファーを洗い流す必要があるからです