• 締切済み

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:ファイルポインタ */ エラーがあったら、書込む処理を行わずに、ファイルクローズ すればいいという事ですね。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ファイルポインタのヘッダーファイルの配置について

    分割コンパイルをしている別ファイルの別関数から、同じファイルポインタ(main関数でfopen済み)に出力(fprintf)は可能でしょうか? 可能な場合、 1.ファイルポインタをexternで宣言 2.ファイルポインタをヘッダファイル内で宣言 3.その他方法 どの方法で実現できるのでしょうか? サンプルコード等書いていただけたら助かります。 よろしくお願い致します。

  • ファイルのデータを構造体に代入する方法

    学習し始めてから時間が経ちましたが、まだ初心者のまま・・・少しずつ頑張っている状態の者です。 今回はタイトルのことで御質問させてください。 関数Read(自己作成)でcsvファイルの内容を読み取り、読み取ったデータを用意しておいた構造体の変数ポインタを利用して代入しようと試みているのですが・・・要領がつかめません。 それで気になったのですが、読み込んだファイルを用意しておいた構造体に入れるにはどんな方法があるかよろしければご教授下さい。 私としてはforを使ったやり方があるのなら是非見本を見せてほしいのですが・・・ ちなみに、私が考えていたプログラム案は以下の通りです。 構造体にはcsvファイル・1レコード分の情報が入る構成。 構造体と読み取るファイルの構造は酷似しているが構造体全てに入る情報でない場合がある。 構造体には必要な分、配列領域を確保する ファイルの先頭アドレスはファイルポインタに代入。 構造体の先頭アドレスはポインタ変数に代入。   main関数とは別の関数の引数に2つのアドレスをコピー。 ★ そこでファイルデータを構造体へ代入しmainに戻って出力する。    その関数での戻り値は特になし(成功したら0・・・と考えていたのですが使い道が今のところはreturnだけです) ★で特に悩んでいるので、よろしくお願い致します。

  • C言語のファイル出力について

    C言語のfprintfによるファイル出力について教えてください。 fprintfで、下記の例のように、上書きする行を指定することはできますでしょうか? 出力ファイルは.csv形式で、モードは問いません。 例:既に、sample.csvというファイルがあり、中身が、 0 0 0 1 1 1 2 2 2 とします。プログラムのfprintfで、3 3 3という出力を2行目に上書きし、 0 0 0 3 3 3 2 2 2 と変更する。 もし上記の方法をご存知でしたら、ご教授いただけましたら幸いです。 よろしくお願いいたします。

  • PL/SQLからディレクトリ作成

    いつもお世話になっております。 PL/SQLのプログラムにて、DBより取得した情報をCSVファイルに出力するとき、同時にフォルダを作成するというのは可能でしょうか?現在CSVの出力はできているのですが、フォルダ作成はやはりDOSプロンプトを立ち上げてmkdirコマンドを実行などをしないと無理でしょうか? OS:WIN2000 DB:oracle9i 宜しくお願い致します。

  • EXCELファイルをプログラムで作成する方法

    教えて下さい。 エクセルを使わないで、エクセルで読込める.xlsファ イルを作成する方法を教えて下さい。 言語は、Javaで、画面から設定した値を予め行と列を 決められた所に値を割当、.xlsファイルとして出力し 対です。 .xlsファイルのフォーマットが分かればそれに従えば よいと思いますが… 行と列を意識して.csvファイルにして出力し、エクセ ルで読込む事はできたのですが、直接.xls形式のファ イルを作成をしたいと思いました。 すみませんが、宜しくお願いします。

  • サーバー上のファイル?

    以下のようなソースを用意しました。 これでFileRead.csvというファイルが 作成されたはずです。 しかし、そのファイルがどこにも 見当たりませんし、 入っているはずのstrlinesという 文字列も入っていません。 どこが悪いのでしょうか? また、ファイルはどこにあるのでしょうか? PrintWriter writer = null; writer = new PrintWriter(new BufferedWriter(new FileWriter("FileRead.csv"))); writer.println("strlines"); writer.close();

    • ベストアンサー
    • Java
  • c言語に関する質問です

    こんにちは。 私はとある大学の機械工学科の学生です。 先日プログラミングの授業で課題が出されたのですが、さっぱりわかりません。 目的を達成するために、下のプログラム(使ってるものはC++)の間違いを2か所訂正しなさいというものです。 どこをどう直せばいいのか教えてください。 一番左の数字は、ここで指摘しやすくするための行数です。 1 #include <stdio.h> 2 #include <stdlio.h> 3 // 計算処理をするための関数 4 void operation(FILE* ifp,FILE* ofp) 5 { 6 const int LOOPLIMIT = 10000; //ループ最大回数を規定。エラー対策 7 8 if((ifp==NULL)||(ofp==NULL)){//ファイルポインタのエラー処理 9      fprintf(stderr,"[ERROR]null file poimter detected.\n); 10      exit(-1); 11     } 12 13 for(int i=0;i<LOOPLIMIT;i++){//入力ファイルは1万行までサポート 14 if(fscanf(ifp,"%f%f",&a,&b) == EOF) //入力ファイルから数値2個読み込み 15 break;//読み込めなかったら処理を終了 16 float c = a*b; 17 fprintf(ofp,"%g,%g,%g\n",a,b,c); 18   } 19} 20 // メイン関数 21 int main(int argc,char* argv[]) 22 { 23 FILE* ifp = NULL; //入力用ファイルポインタ 24 FILE* ofp = NULL; //出力用ファイルポインタ 25 char* ifile = NULL; //入力ファイル名 26 char* ofile = NULL; //出力ファイル名 27 28 if(argc!=3){ 29 fprintf(stderr,"Usage:%s inputfile outputfile\n,argv[0]); 30 exit(1); 31 } 32 33 ifile = argv[1]; //パラメータの1番目を入力ファイル名 34 ofile = argv[2]; //パラメータの2番目を出力ファイル名 35 36 if((ifp = fopen(ifile,"rt"))==NULL{ //入力ファイルを開く 37 fprintf(stderr,"Can't open file %s\a\n",ifile); //開けなかったら終了 38 exit(2); 39 } 40 if((ifp = fopen(ofile,"wt"))==NULL{ //出力ファイルを開く 41 fprintf(stderr,"Can't open file %s\a\n",ofile); //開けなかったら終了 42 exit(3); 43 } 44 45 operation(ifp,ofp); 46 47 fclose(ofp); 48 fclose(ifp); 49 return(0); 50 } 入力ファイル例(inputdata.txt) 147 0.369 258 0.147 369 0.258 ファイル出力結果の例(outputdata.csv) 147, 0.369, 54.243 258, 0.147, 37.926 369, 0.258, 95.202 画面出力結果の例 147 x 0.369 = 54.243 258 x 0.147 = 37.926 369 x 0.258 = 95.202 ご面倒かもしれませんが、お願いいたします。

  • ファイル出力のことで質問です。

    プログラムを作る際、実行結果をファイルの方に出力するようにしたいのですが、どのようにファイルを用意すればいいのか分かりません。例えば、 fprintf([ファイルポインタ],"Hello¥n"); というようにして、この「Hello」を「file1.txt」というファイルに出力したいのですが、その「file1.txt」というファイルをどうやって作るのか分かりません。助けてください。

  • ファイル出力ついて

    当方、JAVA初心者です。 CSVファイルの出力を行うプログラムを作成しています。 仕様として1行目はヘッダ部分を出力し、 2行目以降にDBの値を出力するCSVファイルを作成しようとしています。 例 (ヘッダ部分)"項目A----","項目B----","項目C----","項目D----" (データ部分)"項目Aの値","項目Bの値","項目Cの値","項目Dの値"             ・             ・ ですが、データ部分の個数が不変になっており、ヘッダ部分がずれてしまいます。 例 項目Cの数が2個ある場合はデータ部分に項目Cの値を2個出力する為、 項目Dのヘッダ部の列の下に項目Cの2個目の値が書き込まれてしまいます。 "項目A----","項目B----","項目C-----","項目D-----" "項目Aの値","項目Bの値","項目Cの値1","項目Cの値2","項目Dの値"             ・             ・ そこで、先にデータ部分の書き込みを行い、それぞれの項目のデータ件数の最大値を保持し、最後にデータ件数の最大値に合わせてヘッダ部分の書き込みを行おうと考えているのですが、 ファイルをopenしなおす方法以外で、 先に2行目以降の書き込みを行い、最後に1行目の書き込みを行う方法がわからなく困っております。 ご回答のほど、宜しくお願いします。

    • ベストアンサー
    • Java
  • CSVファイルへ出力

    jspとjavaBeansを使用しています。 顧客情報をDBから検索して明細を画面出力し帳票印刷する ために、データをCSVファイルへ出力したいのですが、 どうやってCSVファイルへ出力するのでしょうか? ごく簡単な形式でいいので教えて下さい。

    • ベストアンサー
    • Java
エラーコード0xc000012fの解消方法
このQ&Aのポイント
  • 富士通ノートPCにインテルグラフィックドライバーVer30を「アップデートナビ」経由でダウンロード/インストール後、マイクロソフトオフィスを起動時に0xc000012fのエラーが表示される。
  • エラーメッセージの表示を続けると起動できるが、解決方法を知りたい。
  • 「富士通FMV」ユーザー向けの質問です。詳しい方、教えてください。
回答を見る