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