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


キンタ  2005-03-09 19:06:20  No: 56641  IP: 192.*.*.*

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 08:50:28  No: 56642  IP: 192.*.*.*

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

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

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

編集 削除