- 締切済み
0バイトファイルの作成
PRO*Cで、DBから取得した値をCSVファイルに出力するプログラムを 作成しています。 fprintf関数で書込んでいるのですが、 途中でエラーが発生した場合(異常終了)、 今まで書込んでいたデータを残さず、0バイトファイルを 作成する仕様になっているのですが、 単純にファイルポインタにNULLを代入して、 ファイルクローズすればできますか?
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- 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
それらの方法だと不確実だから テンポラリに吐き出してエラー無しの場合だけそのテンポラリを本データに置き換えるのが妥当じゃないかと思うけど…
補足
テンポラリというのは、普通にchar str_buff[1024]; 等と 変数宣言しておいたものに、1行1行(※改行付き)書込んでいって 最終的にエラーがなかったら、以下の様に書き込み、 fprintf(fp, "%s", str_buff); /* fp:ファイルポインタ */ エラーがあったら、書込む処理を行わずに、ファイルクローズ すればいいという事ですね。 ありがとうございます。