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()等を使用しても、エラーはとれないようでした。
どうすればよろしいのでえしょうか?
fopen/fwrite でも同じ事が起こります。ある意味あたりまえの動作ですね。
operator << や fwrite では、即座にディスク入出力が行われるわけではなくて
内部バッファに書き込みが予約されるだけです(速度向上のため)
実際の書き込みはバッファがいっぱいになるか、または書き込みを明示した時に行われ、
そこで初めて正しく書けなかったことが検出され bad になります。
最初からディスクフルであっても同じことです。
提示の例ではデストラクタがファイルを閉じる際に bad 検出がされますが、
既に手遅れ、プログラマが検出することは不可能です。
printf() の前、 << の後に outfile.flush(); を実行すれば bad になるでしょう。
毎回 flush() してしまうと激遅になること間違いなしですので、
どこにどれだけの頻度で flush() すると良いかはプログラマのさじ加減。
ツイート | ![]() |