web-dev-qa-db-ja.com

std :: fstreamを閉じる必要がありますか?

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

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

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

54
Tobias Langner

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

fstreamis適切なRAIIオブジェクト、それはdoesスコープの最後で自動的に閉じ、そして絶対にスコープの最後で閉じるだけで十分な場合にcloseを手動で呼び出すためにwhatsoeverは必要ありません。

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

そして、Drakoshaはcloseを呼び出すことでストリームの失敗ビットをチェックできる可能性があると考えていますが、とにかく誰もそれを行いません。

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

ifファイルのクローズの成功を確認したい場合は、手動で実行します(ただし、その場合のみ)。

86
Konrad Rudolph

エイミー・リーの答えに追加するには、この方法でもエラーをチェックできるため、手動で行う方が良いでしょう。

ところで、 "close" manpage :によると

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

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

5
Drakosha

私はあなたのfstreamを閉じて、バッファをフラッシュする必要があるので、私が言われたことをお勧めします

1
Amy Lee