今回は、ファイルに保存されている名前、身長、体重のデータを1件ずつ読み込んで、画面に表示し、最後に平均身長と平均体重を表示するプログラムをご紹介しよう。
なお、本プログラムは、Windows 11 Home(23H2)上で、 Visual Studio Code(1.91.1)を使用して作成し、gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0で コンパイルしている。
//名前と身長と体重を読み込んで平均値を表示するプログラム
#include <stdio.h>
int main(void)
{
FILE *fp;
if((fp = fopen("height-weight.txt","r")) == NULL)
printf("ファイルをオープンできません\n");
else {
int ninzu = 0; //人数
char name[100]; //名前
double height,weight; //身長・体重
double hsum = 0.0; //身長の合計
double wsum = 0.0; //体重の合計
while (fscanf(fp,"%s%lf%lf",name,&height,&weight)== 3)
{
printf("%-10s %5.1f %5.1f\n",name,height,weight);
ninzu++;
hsum +=height;
wsum +=weight;
}
printf("-----------------------\n");
printf("平均 %5.1f %5.1f\n",hsum / ninzu,wsum / ninzu);
fclose(fp);
}
return 0;
}
「height-weight.txt」ファイルの内容
Uemura 160.0 59.3
Inoue 162.0 51.6
Murai 170.0 76.5
Tanaka 175.0 83.9
Wada 175.0 72.5
実行結果
Uemura 160.0 59.3
Inoue 162.0 51.6
Murai 170.0 76.5
Tanaka 175.0 83.9
Wada 175.0 72.5
-----------------------
平均 168.4 68.8
本プログラムでは、ファイルからのデータの読み取りには、fscanf関数を利用している。
この関数は、scanf関数と同等な入力を、任意のストリームに対して行うものである。
なお、scanf関数とfscanf関数は、読み取りに成功した項目の個数を返却する。
したがって、本プログラムのwhile文は、fscanf関数の返却値が3である(名前、身長、体重)あいだ、繰り返しを続ける。これは、データが読み取れなくなる(読み取った項目数が3でなくなる)と繰り返しが終了することを意味する。
(参考)新・明解C言語 入門編 第2版 柴田 望洋(著)
コメント