ファイルが与えられて、それをもとに入出力処理を行うときのやりかたを個人的な覚書とともにシェアします。
以下覚書。解説あまりないです。
- 下のようなデータ、point.csvが以下のような書式付きで与えられていたとしますね。
- 左から順に、出席番号、英語、数学、国語、理科、社会の順でカンマ区切りで与えられているとします。
- 得点で成績をつけて、科目ごとにそれぞれ別々のファイルに出席番号と成績をカンマ区切りで書き込みます。
point.csv
1001,99,83,94,100,86
1002,42,15,61,44,57
1003,37,75,65,28,49
1004,58,52,51,62,55
1005,83,90,33,27,10
1006,41,27,36,85,86
1007,90,56,83,48,95
1008,12,89,24,78,21
- ここからソースコードです。
score.c
#include <stdio.h>
#define seito 8
int main(void){
//配列は全科目用意してるけど英語の成績のみ書き出すところまで書いてます。
printf("Start\n");
int num[seito],eng[seito],math[seito],japa[seito],sci[seito],civ[seito];
int i;
//読み込み用ファイルのロード
FILE *fp;
if( (fp = fopen( "score.csv", "r" )) == NULL) {
printf("can not open write file.");
return -1;
}
//ファイルから配列にデータを読み込む
for( i = 0; i < seito; i++ ) {
if( fscanf( fp, "%d,%d,%d,%d,%d,%d\n",&num[i],&eng[i],&math[i],&japa[i],&sci[i],&civ[i]) != EOF );
}//これでファイルの最後まで1行ごとに書式指定で読み込んでくれます。
fclose(fp);//読み込み用のファイルは不要なので閉じておく。
//英語の成績を処理するために、まずは書き込み用のファイルをオープンする。
if( (fp = fopen( "grade_Eng.csv", "w" )) == NULL) {
printf("can not open write file.");
return -1;
}
for( i = 0; i < seito; i++){//点数に応じてファイルに書き込み。
if(eng[i] < 0 || eng[i] > 100){
fprintf(fp,"%d,%s\n",num[i],"X");
}
else if(eng[i] < 60){
fprintf(fp,"%d,%s\n",num[i],"F");
}
else if(eng[i] < 70){
fprintf(fp,"%d,%s\n",num[i],"C");
}
else if(eng[i] < 80){
fprintf(fp,"%d,%s\n",num[i],"B");
}
else if(eng[i] < 90){
fprintf(fp,"%d,%s\n",num[i],"A");
}
else {
fprintf(fp,"%d,%s\n",num[i],"A+");
}
}//fpを閉じるまでは上書きではなく追加書き込みしてくれるからこれで大丈夫です。
fclose(fp);
printf("End\n");
return 0;
}
画面出力結果
Start
End
ファイル出力
grade_Eng.csv
1001,A+
1002,F
1003,F
1004,F
1005,A
1006,F
1007,A+
1008,F
最後に
今回は英語のみしましたが、成績判定のところとかを関数化するなり、または新しくfpにgrade_math.csvを開いてeng[i]をmath[i]に変えて後ろにおなじようにくっつけて、成績判定して書き込んでクローズを科目数分行えば可能かと思います。
もちろん、2次元配列や構造体を使うほうが汎用性が出て便利にはなりますが、文字列や文字を処理する際にポインタなどを使うことが多く複雑になりやすいです。。