納得C言語!
演習問題X 第3問の解答
3 データ保存機能の追加
解答プログラム
#include <stdio.h>
#include <stdlib.h>  //exit()で使用
//構造体の型宣言
struct point{
int ei;
int koku;
int suu;
int ri;
int sya;
};
struct student{
int s_no;
char name[256];
int s_year;
char s_class[256];
struct point s_point;
};
//プロトタイプ宣言の初期化
void show(struct student *p);
void input(struct student *p);
void file_out(struct student *p);
int main(){
int sw=1; //switch用変数
//構造体の宣言
//ユーザより入力するので大きめの配列を確保する
struct student school[256];
//構造体ポインタを宣言し先頭アドレスを代入
struct student *p;
p=school;
printf("************成績表(プロトタイプG)************\n");
//0が入力されたら終了
while(sw!=0){
printf("何がしたいわけ!?\n");
printf("1:成績表示\n2:データ入力\n3:ファイルに書き出し\n0:終了\n>>");
scanf("%d",&sw);
//swの値で行動を変化
switch(sw){
//成績表表示
case 1:
show(p);
break;
//データ入力
case 2:
input(p);
break;
//データをファイルへ出力
case 3:
file_out(p);
break;
//終了
case 0:
printf("入力を終了します\n");
break;
//それ以外
default:
printf("指定数以外の入力です\n");
break;
}
}
return 0;
}
:
省略
:
/******************************/
/* void file_out() */
/* ファイルへ保存 */
/* 引数1:構造体へのポインタ */
/* 戻り値:なし */
/******************************/
void file_out(struct student *p){
//ファイル構造体へのポインタを取得
FILE *fp;
int i = 0;
//書き込みモードでオープン
//今回は自作関数内で開くので
//失敗した場合は強制終了
if(!(fp=fopen("成績表.txt","w"))){
printf("ファイルオープンエラー!!\n");
exit(1);
}
//学籍番号がになるまで繰り返す
while(((p+i)->s_no)!=0){
//fprintf(ファイルポインタ, 格納する型, 格納するデータ
fprintf(fp,"%d %s %d %s %d %d %d %d %d\n",
(p+i)->s_no,
(p+i)->name,
(p+i)->s_year,
(p+i)->s_class,
(p+i)->s_point.ei,
(p+i)->s_point.koku,
(p+i)->s_point.suu,
(p+i)->s_point.ri,
(p+i)->s_point.sya
);
i++;
}
//ファイルクローズ
fclose(fp);
printf("ファイル保存完了\n\n");
}
解説
(3)以降は(2)と同じなので、すでに作ってある自作関数を省略します。
ファイル構造体へのポインタを宣言し、書込みモードで開きます。
失敗した場合、exit(1)で強制終了させてしまいます。
次に、whileで学籍番号((p+i)->s_no)が0になるまでfprintfでファイルに格納していきます。
(2)と同様にここでもiを1足すのを忘れないようにしましょう。