今回は,前回のファイルの復習と,「ファイルからデータを配列に読み込む」,「配列データをファイルへ書き出す」手順を学ぶ.
前回のプログラムでは,ファイルからデータを一個取り出したり書き込んだりを行いました.
では,ファイルからすべてのデータを配列にすべて読み込んで,その後,画面に表示するにはどうしたら良いか.
配列にキーボードからデータを読み込みには,
#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(右クリック-->[対象をファイルに保存] )を読み込んで,
を第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システムを使って提出すること.
授業終了時に送るのは出席の確認用であり,完成した課題は提出用の回に送ること.
(提出期限を厳守し,提出用の回に提出しないと採点を行わない)