- ベストアンサー
ファイルを読み取り合格者のIDを表示するプログラム
- ファイルを開いてデータを読み込む方法がわからないと思っています。
- 各科目の点数が60点以上かつ3科目の合計点が200点以上の合格者のIDを表示するプログラムを作成したいです。
- テストデータには100人分のデータがあり、左からID、教科A、教科B、教科Cの順になっています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#include <stdio.h> #include <stdlib.h> int main (int argc, const char * argv[]) { FILE *fp; int id, a, b, c; fp = fopen("test.txt", "r"); if (fp == NULL) { fputs("ファイルを開くことができません", stderr); exit (1); } while (!feof(fp)) { fscanf(fp, "%d%d%d%d", &id, &a, &b, &c); if ((a >= 60 && b >= 60 && c >= 60) && (a+b+c >= 200)) { printf("%d\n", id); } } fclose(fp); } ポイント ・exit関数を利用するためのstdlib.hの明示的なインクルード ・変数名はそれなりに分かりやすく。今回の例だとabcは教科と被って分かりにくい。 ・文字列の1行出力ならfprintfよりfputsのほうが早くて軽いです ・キーワードや関数の大文字小文字は間違えないように。エラーになります。 ・テキストファイルの読み込みはfeofでファイル終端判定をすると楽です ・fscanfの引数の仕様はマニュアルを読んで勉強してください ・1人分ずつ処理をするので変数は100人分の配列としなくてもよい ・明示的なfclose
その他の回答 (2)
- senbei12
- ベストアンサー率42% (6/14)
数字がスペース区切りなのでscanf系関数を使えという誘導かと思われます。 課題等で素人っぽさを醸し出すならfscanf関数を使えばよろしいかと。 それなりに経験がある方だとscanf系関数はまず使わないので、fgets関数で1行読み込んで、読み込んだ文字列に対してstrtok関数等で文字列を分解してデータ抽出するといった流れになると思います。
補足
回答ありがとうございます。 fscanf関数でやってみたのですが、コンパイルがとおりませんでした; エラーメッセージをみるとWHILEの行とその次の行にerrorがあるようなのですが、どこをなおせばいいかわかりません。よければ教えていただけないでしょうか。 あと、他にも間違いがあったら教えていただきたいです。 よろしくお願いしますm(_ _)m #include <stdio.h> int main(){ FILE *fp; int i; int a[100],b[100],c[100],d[100]; fp=fopen("test.txt","r"); if(fp==NULL){ fprintf(stderr,"ファイルを開くことができません\n"); exit(1); } WHILE(fscanf(fp,"%d,%d,%d,%d",&a,&b,&c,&d)!=EOF){ for(i=0;i<100;i++){ if(b[i]>=60 && c[i]>=60 && d[i]>=60 && b[i]+c[i]+d[i]>=200){ printf("%d",a[i]);} } } }
- Wr5
- ベストアンサー率53% (2173/4061)
fscanf()とかfgets()+sscanf()とか…そういったものも見つけられませんでしたか……。 fopen()に関連する関数群とかの載ったページも…。 fopen()で得たfpを引数にする関数とか、関連する物としてまとめて説明されることが多いと思うんですけどね…。
お礼
無事解決しました。 ありがとうございましたm(_ _)m
補足
回答ありがとうございます。 勉強不足で申し訳ありませんでした。m(_ _)m fscanf関数を使ってやってみたので、よければ間違いを教えていただきたいです。
お礼
とてもわかりやすく、ポイントまでまとめて書いて下さりありがとうございます! なるほどなるほどと、とても勉強になりました。 おかげさまでよく理解することができました。 これからも勉強頑張りたいと思います。 今回は本当にありがとうございました。 また何かありましたらよろしくお願い致します。m(_ _)m