第8回:配列とファイル (11/17)


第7回演習:解答例


配列とファイル

今回は,前回のファイルの復習と,「ファイルからデータを配列に読み込む」,「配列データをファイルへ書き出す」手順を学ぶ.

前回のプログラムでは,ファイルからデータを一個取り出したり書き込んだりを行いました.
では,ファイルからすべてのデータを配列にすべて読み込んで,その後,画面に表示するにはどうしたら良いか.

配列にキーボードからデータを読み込みには,


#include <stdio.h>
 
void main()
{
    int i, n;
    int data[10];
 
    for(i = 0; i < 10; i++) {
        printf("%d番目のデータ:", i+1);
        scanf("%d", &(data[i]) );
    }
 
    /*  画面に表示  */
    for(i=0; i<10; i++) {
        printf("%d¥n", data[i]);
    }
}

のような手順でした.

これをもとに,ファイルから数値を10個,配列に読み込むように改良してみよう.


#include <stdio.h>
 
void main()
{
    int i, n;
    float siny[10];
    FILE *fp;
 
    fp = fopen("sincos.csv", "r");     /*  読み込みモードでファイルをオープン  */
    if(fp == NULL) {
        printf("ファイルを開くことが出来ませんでした.¥n");
        return;
    }
 
    for(i=0; i<10; i++){
        fscanf(fp, "%f", &(siny[i]) );     /*  1行読む  */
    }
 
    fclose(fp);
 
    for(i=0; i<10; i++) {
        printf("%f¥n", siny[i]);
    }
}

ここで,事前にファイル中のデータ個数がわからない場合はどうしたらよいだろう?

ファイルの終わりには,文字列と同様,ファイル終端を表す特殊なマーク「EOF」がついている.(EOFは,End Of File の略)

ファイルを先頭から順に読み込んでゆき,終わりに達したかどうかを判定する(=EOFを探す)には,feof()関数を使う.
この関数はファイルの終わりに達すると「真」(正確にはゼロでない値)になる.

これを使ってデータの並んだファイルから配列にデータを読み込んでみよう.

配列のサイズは,あらかじめ読み込むデータより大きめに用意しておく.


#include <stdio.h>
 
void main()
{
    int i, n;
    float siny[512];    /* 大きめのサイズの配列を用意しておく. */
 
    FILE *fp;
 
    fp = fopen("sincos.csv", "r");
    if(fp == NULL) {
        printf("ファイルを開くことが出来ませんでした.¥n");
        return;
    }
 
    n = 0;
 
    /*  ファイルが終わりでない 「かつ」 配列を飛び出さないうちは,読み込みを続ける  */
    while ( ! feof(fp) && n < 512) {
        fscanf(fp, "%f", &(siny[n]));
        n++;
    }
 
    fclose(fp);
 
    n = n-1; /* 上のwhileループでは,EOFの行を余分に読み込んでいるので,実際のデータ数は一つ少ない. */
 
    /*  画面に表示  */
    for(i=0; i<n; i++) {
        printf("%f¥n", siny[i]);
    }
}

演習課題

(1)試験結果のデータファイルtestdata.txt(右クリック-->[対象をファイルに保存] )を読み込んで,

  1. 平均値
  2. 最高点 & 最低点

を第6回(4)のプログラムを元に求め,画面に表示するプログラムを作成せよ.データ数はEOFを元に判断すること.
結果は平均44.84,最高点98,最低点1点となる.

(2)次に各点数に成績をつけて,ファイル("result.csv")に保存するプログラムを作成せよ.
結果については,データと成績両方をファイルに書き込むこと.
csvファイルに書き込む時,fprintf関数における値の型を書く所をカンマ区切りすることによって,
セルの列を区別することができる.

点数 成績
90点以上 S
80点以上90点未満 A
70点以上80点未満 B
60点以上70点未満 C
60点未満 F

(3)今度は成績に順位を付けて、csvファイルに保存するプログラムを作成せよ.ファイル名は任意で指定すること.

注意1:ただし,同じ点数の者が2名いたら,次の点数の者の順位は,一つ飛ぶ.
たとえば,47点が53位で,47点の者が2名いたとすると,46点の者は,55位となる.

注意2:結果についてはデータと順位両方をファイルに書き込むこと. csvファイルに書き込む時,fprintf関数における値の型を書く所をカンマ区切りすることによって,
セルの列を区別することができる.





授業終了時までのプログラムと完成した提出用プログラムをoh-meijiシステムを使って提出すること.
授業終了時に送るのは出席の確認用であり,完成した課題は提出用の回に送ること.
(提出期限を厳守し,提出用の回に提出しないと採点を行わない)