• 締切済み

0バイトファイルの作成

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

みんなの回答

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.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バイトで書き込むと、エラーになるなど、何もしない」と言う処理系があるため、どっちになるかは「運しだい」です)

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

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

goo393
質問者

補足

テンポラリというのは、普通にchar str_buff[1024]; 等と 変数宣言しておいたものに、1行1行(※改行付き)書込んでいって 最終的にエラーがなかったら、以下の様に書き込み、 fprintf(fp, "%s", str_buff); /* fp:ファイルポインタ */ エラーがあったら、書込む処理を行わずに、ファイルクローズ すればいいという事ですね。 ありがとうございます。