• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:fprint()とfscanf()を用いたプログラムについて)

fprint()とfscanf()を用いたプログラムについて

このQ&Aのポイント
  • fprint()とfscanf()を用いたプログラムでは、テキストファイルへの出力は成功していますが、得点・合計得点の表示がうまくいかない状況です。
  • csv関数では、キーボードから名前と得点を入力し、それをテキストファイルに書き込んでいます。
  • display_csv_file関数では、テキストファイルからデータを読み込み、名前と得点を表示し、合計得点も計算して表示しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#1,2の注意点を修正したソースを挙げます。 正確にはCSVと言えなくなっていますが、 動作はします。 #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct{ char name[20]; int ten[3]; }RECORD; void csv(char *filename); void display_csv_file(char *filename); FILE *fpcsv; void main(int argc, char **argv){ csv(argv[1]); /* キーボード ⇒ CSV(テキスト)ファイル */ display_csv_file(argv[1]); /* CSV(テキスト)ファイル ⇒ ディスプレィ */ } void csv(char *filename){ RECORD seiseki; int i; fpcsv = fopen(filename,"w+"); while(printf("name(Ctrl + Z終了) >"),gets(seiseki.name) != NULL){ if(seiseki.name != NULL){ for(i = 0; i < 3;i++){ printf("得点%d >", i + 1); scanf("%d", &seiseki.ten[i]); } fprintf(fpcsv,"%s %d,%d,%d\n", seiseki.name, seiseki.ten[0],seiseki.ten[1],seiseki.ten[2]); } rewind(stdin); } fclose(fpcsv); } void display_csv_file(char *filename){ char buf[255]; int i, sum, tokkuten[3]; fpcsv = fopen(filename,"r+"); while(fscanf(fpcsv,"%s %d,%d,%d", buf, &tokkuten[0],&tokkuten[1],&tokkuten[2]) != EOF){ /*名前表示*/ /* strtok(buf,","); */ printf("name:%s ",buf); /*得点表示&合計計算*/ printf("得点1:%d 得点2:%d 得点3:%d\n", tokkuten[0],tokkuten[1],tokkuten[2]); sum = tokkuten[0] + tokkuten[1] + tokkuten[2]; /*合計表示*/ printf(" 合計得点: %d\n", sum); } fclose(fpcsv); } 実行結果 name(Ctrl + Z終了) >test 得点1 >12 得点2 >34 得点3 >56 name(Ctrl + Z終了) >^Z name:test 得点1:12 得点2:34 得点3:56 合計得点: 102

yukikundesuyo
質問者

お礼

ありがとうございます。fscanfの第2引数の書式はテキストとあわせてやらないとうまくできないことがよく分かりました。

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

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

あと、 >fscanf(fpcsv,"%s%d%d%d", buf, tokkuten[0],tokkuten[1],tokkuten[2]) で、%sが全てとってしまうので、 名前の部分は、空白区切りにするか 別途切り出す処理が必要です。

yukikundesuyo
質問者

補足

やってみましたが、うまくできませんでした。1レコードしか入力していないのに表示の得点も出力件数もめちゃくちゃです。 なぜでしょうか? 下記、実行結果例 name(Ctrl + Z終了) >a 得点1 >1 得点2 >2 得点3 >3 name(Ctrl + Z終了) >^Z name:a 得点1:1 得点2:4253452 得点3:0 合計得点: 4253453 name:, 得点1:2 得点2:4253452 得点3:0 合計得点: 4253454 name:, 得点1:3 得点2:4253452 得点3:0 合計得点: 4253455 name:, 得点1:3 得点2:4253452 得点3:0 合計得点: 4253455

すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

>fscanf(fpcsv,"%s%d%d%d", buf, tokkuten[0],tokkuten[1],tokkuten[2]) fscanfで &tokuten[0] のようにアドレスを指定しないといけないと思います。

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