4 数値計算のファイル入出力

数値計算を行うと,大量のデータが出力される.また,大量の数値を読み込むことも多い. そのため,ファイル--ハードディスクを使って,データの保管を行う.ここでは,今後 の数値計算の講義でつかう基本的なテクニックをプログラムを例にとって,示す.

4.1 ファイル出力の実際

数値計算の出力は大量の数値データのことが多い.そのデータをファイルに保管する基本的な テクニックは,次の通りである.

これらを使った例をリスト3に示す.これは,三角関数の値をファイル 出力するプログラムである.

   1 #include <stdio.h>
   2 #include <math.h>
   3 #define N 360
   4 
   5 int main(void)
   6 {
   7   FILE *out_file;
   8   double x, dphi;
   9   int i;
  10   
  11   dphi = 2*M_PI/N;
  12   
  13   out_file = fopen("trifunc.txt","w");
  14   
  15   for(i=0; i<=N; i++){
  16     x=i*dphi-M_PI;
  17     fprintf(out_file, "%15.7e\t%15.7e\t%15.7e\t%15.7e\n", x, sin(x), cos(x), tan(x));
  18   }
  19   
  20   fclose(out_file);
  21 
  22   return 0;
  23 }
\fbox{実行結果}

このプログラムを実行すると,「trifunc.txt」というファイルができる.このファイル の中は,次のようになっている.

 -3.1415927e+00	 -1.2246064e-16	 -1.0000000e+00	  1.2246064e-16
 -3.1241394e+00	 -1.7452406e-02	 -9.9984770e-01	  1.7455065e-02
 -3.1066861e+00	 -3.4899497e-02	 -9.9939083e-01	  3.4920769e-02
 -3.0892328e+00	 -5.2335956e-02	 -9.9862953e-01	  5.2407779e-02
 -3.0717795e+00	 -6.9756474e-02	 -9.9756405e-01	  6.9926812e-02
 -3.0543262e+00	 -8.7155743e-02	 -9.9619470e-01	  8.7488664e-02
 -3.0368729e+00	 -1.0452846e-01	 -9.9452190e-01	  1.0510424e-01
 -3.0194196e+00	 -1.2186934e-01	 -9.9254615e-01	  1.2278456e-01
 -3.0019663e+00	 -1.3917310e-01	 -9.9026807e-01	  1.4054083e-01
 -2.9845130e+00	 -1.5643447e-01	 -9.8768834e-01	  1.5838444e-01
 -2.9670597e+00	 -1.7364818e-01	 -9.8480775e-01	  1.7632698e-01
 -2.9496064e+00	 -1.9080900e-01	 -9.8162718e-01	  1.9438031e-01
   
   途中は省略.長いので全て記述すると紙の無駄.

  3.0892328e+00	  5.2335956e-02	 -9.9862953e-01	 -5.2407779e-02
  3.1066861e+00	  3.4899497e-02	 -9.9939083e-01	 -3.4920769e-02
  3.1241394e+00	  1.7452406e-02	 -9.9984770e-01	 -1.7455065e-02
  3.1415927e+00	  1.2246064e-16	 -1.0000000e+00	 -1.2246064e-16
[練習4]
次の関数の値(実数部と虚数部)を, $ 0\leqq x \leqq 2\pi$を100等分し てファイルに書き出せ.

  $\displaystyle f(x)=e^{ix}$   $\displaystyle g(x)=\cos x+i\sin x$   (1)

4.2 ファイル入力の実際

また,数値計算では大量の数値データをハードディスクから読み込むことも多い.ここで の講義でも,データを読み込むことがある.また,卒研ではなおさらである.数値計算や 実験でのファイルからのデータ入力のコツは,次のとおりである .

これらを使った例をリスト4に示す.先ほど作成したファイル内容を読 み込み,ディスプレイに出力するプログラムをである.

   1 #include <stdio.h>
   2 
   3 int main(void)
   4 {
   5   FILE *in_file;
   6   double x[500], y1[500], y2[500], y3[500]; //ちょっと多めの要素を確保
   7   int i, j;
   8   
   9   in_file = fopen("trifunc.txt","r");
  10   
  11   for(i=0; i<=499; i++){
  12     if(EOF == fscanf(in_file, "%lf%lf%lf%lf",&x[i], &y1[i], &y2[i], &y3[i])) break;
  13   }
  14   
  15   fclose(in_file);
  16 
  17   for(j=0; j<i; j++){
  18     printf("%10.7f\t%10.7f\t%10.7f\t%10.7f\n",x[j], y1[j], y2[j], y3[j]);
  19   }
  20 
  21   return 0;
  22 }
\fbox{実行結果}

このプログラムはファイル(trifunc.txt)からデータを読み込み,その値を ディスプレイに出力する.ディスプレイは以下のようになる.

-3.1415927      -0.0000000      -1.0000000       0.0000000
-3.1241394      -0.0174524      -0.9998477       0.0174551
-3.1066861      -0.0348995      -0.9993908       0.0349208
-3.0892328      -0.0523360      -0.9986295       0.0524078
-3.0717795      -0.0697565      -0.9975641       0.0699268
-3.0543262      -0.0871557      -0.9961947       0.0874887
-3.0368729      -0.1045285      -0.9945219       0.1051042
-3.0194196      -0.1218693      -0.9925462       0.1227846
-3.0019663      -0.1391731      -0.9902681       0.1405408
-2.9845130      -0.1564345      -0.9876883       0.1583844
-2.9670597      -0.1736482      -0.9848077       0.1763270
-2.9496064      -0.1908090      -0.9816272       0.1943803
   
   途中は省略.長いので全て記述すると紙の無駄.

 3.0892328       0.0523360      -0.9986295      -0.0524078
 3.1066861       0.0348995      -0.9993908      -0.0349208
 3.1241394       0.0174524      -0.9998477      -0.0174551
 3.1415927       0.0000000      -1.0000000      -0.0000000
[練習5]
webページに載せているファイルには,4列の大量の整数が書かれてい る.各列の整数の最大値と最小値,そして平均値を求めよ.



ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成19年7月4日


no counter