ほぷしぃ

納得C言語!

[第18回]演習問題X 第3問の解答

演習問題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足すのを忘れないようにしましょう。


ヒント ページのトップ 第4問