私の C++ コードでは、常にさまざまな値をファイルに書き込んでいます。私の質問は、ファイルが正常に開かれたという事実を考慮して、 write または << が失敗する状況があるかどうかということです。write または << のすべての呼び出しをチェックして、正しく実行されたことを確認する必要がありますか?
3 に答える
それらをすべてリストするには、失敗の理由が多すぎます。可能なものは次のとおりです。
- パーティションがついにいっぱいになりました
- ユーザーがディスク クォータを超えている
- パーティションは容赦なくアンマウントされました
- パーティションが破損しています (ファイルシステムのバグ)
- ディスクが物理的に故障した
- ...
write または << のすべての呼び出しをチェックして、正しく実行されたことを確認する必要がありますか?
プログラムに障害に対する回復力を持たせたい場合は、間違いなくyesです。そうしない場合、それは単に、書き込んでいるデータが書き込まれる場合と書き込まれない場合があることを意味し、気にしないということになります。
注:すべての操作の後にストリームの状態をチェックするのではなく (これはすぐに非常に面倒になります) std::ostream::exceptions
、ストリームが失敗したときに例外をスローするように設定することができます (このようなディスクの障害は非常に多く発生するため、これは問題になりません)。定義上例外的)。
書き込みが失敗する理由はいくつもあります。私の頭の上から、ここにいくつかあります:
- ディスクがいっぱいです
- ディスクが故障する
- ファイルが NFS マウント上にあり、ネットワークがダウンする
- 書き込んでいるストリーム (ostream は常にファイルであるとは限らないことに注意してください) は、たまたまダウンストリーム リーダーがクラッシュしたときに閉じるパイプです。
- 書き込み先のストリームは TCP ソケットであり、ピアは離れます
等々。
編集:ファイルに書き込んでいるとあなたが言ったことは知っています。コードは、あらゆる種類のストリームを表すことができるostreamに書き込んでいることだけを気にする必要があるという事実に注意を向けたかっただけです。
他のものは、出力の失敗につながる可能性のある状況をカバーしていました。
しかし:
write または << のすべての呼び出しをチェックして、正しく実行されたことを確認する必要がありますか?
これには、私は「いいえ」と答えます。おそらくチェックすることもできます
- ファイルが正常に開かれた場合、および
good()
データを書き込んだ後もストリームが残っている場合。
もちろん、これは、書き込まれたデータの種類と、部分的な書き込みから回復する可能性/相対的な複雑さとアプリケーションの再実行に依存します。
書き込みがいつ失敗したかを正確に制御する必要がある場合 (たとえば、正常な回復を行うため)、リンクされている ostream 例外 syam が最適です。各操作の後にストリーム状態をポーリングすると、コードが肥大化します。