/* 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;
}