「C言語練習」 1-12.c   ・前へ   ・次へ
/* File 出力   1-12.c */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/* exit();を使う為<stdlib.h>を、平方根計算をする為<math.h>を取り込む。*/

main()
{
	int n;
	float sum,s2,d;
	char fname[50],fname2[50];

	FILE *fin;	// fileを扱う宣言−入力用
	FILE *fout;	// fileを扱う宣言−出力用なので file outputの意味でfoutにした。

	printf("* File からdataを読み込んで、平均と標準偏差を求める *\nFile名を入力:");
		gets(fname);
	fin=fopen(fname,"r");
		if (fin==NULL) {printf("File がありません!\n\nEnd\n"); exit(1);}

	putchar('\n');	// 改行は、こうも書ける。

/* putchar は、put character(文字を置く)の意。表示したい文字を''で囲んで( )の中に
入れる。
 */
		sum=0;s2=0;n=0;
	while (! feof(fin)) {
		fscanf(fin,"%f",&d);
		sum+=d; s2+=d*d;
		n++;
		printf("%.2f ",d); if (n%5==0) putchar('\n');
	}
/* 
・前回同様、file終端が来るまでloop を回り続ける。
 なお、この形(feofを使う)でdataを読む時は、最後のdataの後ろには何も付けない様にする
 (,も space も enterも)。
・dataを fscanf [=file scanf] で読む。読み込み窓口の名を初めに書く。書式はscanfと同じ。
 scanf同様、変数名の前に&が必要。次の行で総和と平方和を求めて、更にnを使ってdata数を
 数えている(一回りする度に一つずつ増やす)。
・読み込んだdataをprintfで画面表示。dataを 5個表示したら改行(余りで判断)。
*/
	fclose(fin);	// 読み込みfileを閉じる。

		s2=s2-sum*sum/n; s2=s2/(n-1); s2=sqrt(s2);// 標準偏差計算
	printf("\n(n=%d)  sum=%.f  mean=%.2f  sd=%.2f\n\n",n,sum,sum/n,s2);

/* -------- 以下が file出力に関する事 -------- */
	printf("* File に計算結果を書き込みます。\n出力File名を入力:");
		gets(fname2);
	fout=fopen(fname2,"w");
// 書き込み用fileを開ける。書き込み専用の為 "w"を付けている。

		fprintf(fout,"File: [%s] の計算結果\n",fname);
		fprintf(fout,"(n=%d)  sum=%.f  mean=%.2f  sd=%.2f\n",n,sum,sum/n,s2);

/* fprintf[=file printf]でfileに書き込む。書式はprintfと同じ。fscanf同様、窓口名を初めに
  書く。
 */
	fclose(fout);	// 書き込みfileを閉じる。
/* -------- file出力に関する事、ここまで -------- */

/* この様にして、ある file の data を処理して、その結果を別 file に残す事が出来る。
ここでは finを閉じた後でfoutを開けたが、同時に開いていても構わない。そうすれば、
読み込みと書き込みの並行処理が可能。
 */

printf("\nEnd\n");
return 0;
}


(前に戻る)   ・次へ