76

重複の可能性:
ifstream を手動で閉じる必要がありますか?

呼び出す必要がありますfstream.close()fstream、それとも破壊時にストリームを閉じる適切な RAII オブジェクトですか?

メソッド内にローカルstd::ofstreamオブジェクトがあります。close を呼び出さずにこのメソッドを終了した後、ファイルは常に閉じられていると仮定できますか? デストラクタのドキュメントが見つかりませんでした。

4

3 に答える 3

122

以前の回答は誤解を招くと思います。

fstream 適切な RAII オブジェクトであり、スコープの最後で自動的に閉じます。スコープの最後で閉じるだけで十分な場合は、手動で呼び出す必要はまったくありませんclose

特に、これは「ベスト プラクティス」ではなく、出力をフラッシュする必要はありません。

close呼び出しによってストリームのフェイル ビットをチェックできる可能性があるという Drakosha の意見は正しいですが、いずれにせよ誰もそれを行いません。

理想的な世界では、単純にstream.exceptions(ios::failbit)事前に呼び出して、fstreamのデストラクタでスローされた例外を処理します。しかし残念ながら、デストラクタの例外は C++ では壊れた概念であるため、これは良い考えではありません。

そのため、ファイルのクローズが成功したかどうかを確認したい場合は、手動で行ってください (ただし、その場合のみ)

于 2011-01-26T08:31:07.810 に答える
6

Amy Lee の回答に追加するには、エラーもチェックできるため、手動で行うことをお勧めします。

ところで、「閉じる」マンページによると:

close() の戻り値をチェックしないことはよくあることですが、それでも重大なプログラミング エラーです。以前の write(2) 操作でのエラーが、最後の close() で最初に報告される可能性は十分にあります。ファイルを閉じるときに戻り値をチェックしないと、サイレントにデータが失われる可能性があります。これは特に、NFS とディスク クォータで確認できます。

カーネルが書き込みを遅延させるため、クローズが成功しても、データが disk に正常に保存されたことは保証されません。ストリームが閉じられたときにファイルシステムがバッファをフラッシュすることは一般的ではありません。データが物理的に保存されていることを確認する必要がある場合は、fsync(2) を使用してください。(この時点では、ディスク ハードウェアによって異なります。)

于 2011-01-26T08:27:04.627 に答える
2

バッファをフラッシュする必要があるため、fstreamを閉じるのは良い習慣だと思います。

于 2011-01-26T08:23:16.733 に答える