重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

PRO*Cで、DBから取得した値をCSVファイルに出力するプログラムを
作成しています。

fprintf関数で書込んでいるのですが、
途中でエラーが発生した場合(異常終了)、
今まで書込んでいたデータを残さず、0バイトファイルを
作成する仕様になっているのですが、
単純にファイルポインタにNULLを代入して、
ファイルクローズすればできますか?

A 回答 (2件)

「0バイトのファイル」ってのは「新規作成して、書き込みしないで、クローズした時」に出来ます。



>単純にファイルポインタにNULLを代入して、
>ファイルクローズすればできますか?
残念。「プログラムが終了した瞬間、今まで書きこんでいたデータが残ったままクローズ」されます。

if(error発生) {
 fclose(fp);
 fp=fopen(書き込んでたファイル,"wb");
 fclose(fp);
 exit(255);
}

処理系によっては
if(error発生) {
 fseek(fp,0L,SEEK_SET);
 fwrite("",0,0,fp);
 fclose(fp);
 exit(255);
}
でも動く場合があるけど、移植性が低下するのでお勧め出来ません。
(「長さ0バイトで書き込むと、現在のシークポインタ以降を切り詰める」と言う処理系と「長さ0バイトで書き込むと、エラーになるなど、何もしない」と言う処理系があるため、どっちになるかは「運しだい」です)
    • good
    • 0

それらの方法だと不確実だから


テンポラリに吐き出してエラー無しの場合だけそのテンポラリを本データに置き換えるのが妥当じゃないかと思うけど…

この回答への補足

テンポラリというのは、普通にchar str_buff[1024]; 等と
変数宣言しておいたものに、1行1行(※改行付き)書込んでいって
最終的にエラーがなかったら、以下の様に書き込み、
fprintf(fp, "%s", str_buff); /* fp:ファイルポインタ */

エラーがあったら、書込む処理を行わずに、ファイルクローズ
すればいいという事ですね。

ありがとうございます。

補足日時:2008/01/25 17:50
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!