ofstreamでファイル書き込みエラーを検出するには?


キンタ  2005-03-10 04:06:20  No: 56641

ofstreamを使用して、ディスクがフルの状態のOS上にて
以下ソースで、
     ofstream outfile("hoge.txt");
     if ( !outfile ) {
         printf("### Error!!!!\n");
     }
     try {
         outfile << "hoge" << endl;
     }catch(...){
         printf("### Error!!!!\n");
     }
     printf("outfile.eof  [%d]\n", outfile.eof());
     printf("outfile.fail [%d]\n", outfile.fail());
     printf("outfile.bad  [%d]\n", outfile.bad());
     printf("outfile.good [%d]\n", outfile.good());
hoge.txtを書き込みましたが、エラーが検出できません。
もちろん、hoge.txtも書き込みが正常に行えてません。

fail(),bad()等を使用しても、エラーはとれないようでした。
どうすればよろしいのでえしょうか?


tetrapod  2005-03-10 17:50:28  No: 56642

fopen/fwrite でも同じ事が起こります。ある意味あたりまえの動作ですね。
operator << や fwrite では、即座にディスク入出力が行われるわけではなくて
内部バッファに書き込みが予約されるだけです(速度向上のため)
実際の書き込みはバッファがいっぱいになるか、または書き込みを明示した時に行われ、
そこで初めて正しく書けなかったことが検出され bad になります。
最初からディスクフルであっても同じことです。

提示の例ではデストラクタがファイルを閉じる際に bad 検出がされますが、
既に手遅れ、プログラマが検出することは不可能です。

printf() の前、 << の後に outfile.flush(); を実行すれば bad になるでしょう。
毎回 flush() してしまうと激遅になること間違いなしですので、
どこにどれだけの頻度で flush() すると良いかはプログラマのさじ加減。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加