ファイル入出力

01	/************************************/
02	/* ファイル入出力(平均値の計算後) */
03	/*      coded by Y.Suganuma         */
04	/************************************/
05	#include <stdio.h>
06	
07	int main()
08	{
09	/*
10	         データの読み込み
11	*/
12		FILE *in = fopen("input","r");
13		double sum1 = 0.0, sum2 = 0.0, x, y;
14		int n = 0;
15		while (EOF != fscanf(in,"%lf %lf",&x,&y)) {
16			sum1 += x;
17			sum2 += y;
18			n++;
19		}
20	
21		fclose(in);
22/*
23	         結果の計算と出力
24	*/
25		if (n <= 0)
26			printf("データがない!\n");
27		else {
28			FILE *out    = fopen("output", "w");
29			double mean1 = sum1 / n;
30			double mean2 = sum2 / n;
31			fprintf(out, "人数 %d 英語=%f 数学=%f\n", n, mean1, mean2);
32			fclose(out);
33		}
34	
35		return 0;
36	}
		
12 行目

  fopen は,ファイルから読んだり,ファイルに書いたりするための準備を行う関数です.この行では,ファイル input からの入力の準備を行っています("r"の指定).この関数の左辺にくる変数に対しては,必ず,このような型宣言が必要になります.

14 行目

  変数 n はデータの数(人数)を数えるためのカウンタです.一組のデータを読む度に,18 行目において 1 づつ増加させています.そのため,必ず,初期設定が必要です.

15 行目

  ここでは,繰り返し制御のため,while 文を使用しています.この例の場合は,while 文の方が for 文より好ましいと思います.while 文の中の式の意味は,関数 fscanf の値が EOF で無い限り,16 ~ 18 行目の文を繰り返すことを意味しています.EOF とは「End of File」のことであり,関数 fscanf の値が EOF であるということは,「データを読もうとしたが既にデータがなかった」ということを意味しています.従って,この while 文によって,データが存在する間,そのデータを読み込み,16 ~ 18 行目の処理が行われます.

  また,fscanf は,ファイルからデータを読み込むための関数です.カッコの中の最初に fopen で使用した変数が来る以外,基本的に,関数 scanf と同じです.

21 行目

  入力データを読み終え,ファイルを必要としなくなったので,fclose によって,その終了処理を行って(閉じて)います.プログラムの実行が終了すると使用していたファイルはすべて自動的に閉じられるため,このプログラムでは必要性は少ないですが,一般的に,使用し終わったら閉じておいた方が良いと思います.

28, 31, 32 行目

  出力ファイルに対する入力ファイルと同様な処理です("w"の指定).fprintf は,ファイルにデータを書き込むための関数であり,カッコの中の最初に fopen で使用した変数が来る以外,基本的に,関数 printf と同じです.

  参考のため,cin や cout の相当する機能を使用してファイル入出力を行うプログラムの例を書いておきます.行っている内容は,上記のプログラムと全く同じです.

/************************************/
/* ファイル入出力(平均値の計算後) */
/*      coded by Y.Suganuma         */
/************************************/
#include <iostream>
#include <fstream>

int main()
{
/*
		 データの読み込み
*/
	std::ifstream in("input");

	double sum1 = 0.0, sum2 = 0.0;
	int n = 0;
	while (!in.eof()) {
		double x, y;
		in >> x >> y;
		sum1 += x;
		sum2 += y;
		n++;
	}

	in.close();
/*
		 結果の計算と出力
*/
	if (n <= 0)
		std::cout << "データがない!\n";
	else {
		std::ofstream out("output");
		double mean1 = sum1 / n;
		double mean2 = sum2 / n;
		out << "人数 " << n << " 英語=" << mean1 << " 数学=" << mean2 << std::endl;
		out.close();
	}

	return 0;
}