今回は,前回のファイルの復習と,「ファイルからデータを配列に読み込む」,「配列データをファイルへ書き出す」手順を学ぶ.
前回のプログラムでは,ファイルからデータを一個取り出したり書き込んだりを行いました.
では,ファイルからすべてのデータを配列にすべて読み込んで,その後,画面に表示するにはどうしたら良いか.
配列にキーボードからデータを読み込みには,
#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(右クリック-->[対象をファイルに保存] )を読み込んで,
を第5回(3)のプログラムを元に求め,画面に表示するプログラムを作成せよ.データ数はEOFを元に判断すること.
結果は平均44.84,最高点98,最低点1点となる.
(2)次に各点数に成績をつけて,ファイル("result.csv")に保存するプログラムを作成せよ.
結果については,データと成績両方をファイルに書き込むこと.
csvファイルに書き込む時,fprintf関数における値の型を書く所をカンマ区切りすることによって,
セルの列を区別することができる.
点数 | 成績 |
90点以上 | S |
80点以上90点未満 | A |
70点以上80点未満 | B |
60点以上70点未満 | C |
60点未満 | F |
(3)最後に各成績に何人いるか計算し,その数をファイル(number.txt)に書き出すプログラムを作成せよ.
結果は, S:6 A : 5 B:11 C : 12 F:66 となる.
(4)キーボードから入力した文字列をファイル(moji.txt)に保存し,その文字列の文字数を数えるプログラムを作成せよ.
文字列については過去のページで各自確認すること.
授業終了時までのプログラムと完成した提出用プログラムをoh-meijiシステムを使って提出すること.
授業終了時に送るのは出席の確認用であり,完成した課題は提出用の回に送ること.
(提出期限を厳守し,提出用の回に提出しないと採点を行わない)