3 ファイル

3.1 基本

ファイル--この講義ではハードディスク--を読み書きするためには,プログラムには次 の4つ項目を記述する.
  1. FILE型のポインター(ファイルポインター)の定義をする.
  2. fopen()関数を使って,ファイルを開く.
  3. fscanf()関数を使って,ファイルの内容を読む.あるいは,fprintf() 関数を使って,ファイルにデータを書き出す.
  4. fclose()関数を使って,ファイルを閉じる.

3.1.1 ファイルポインターの定義

ファイルの操作を行うためには,ファイルポインター2を定義する必要がある.通常の変数の定義と同じように,型名と変数名を書く.ただし, ポインターなので,変数の前にアスタリスク(*)を忘れないように!
	  FILE *hoge;

ここで,hogeがファイルポインターで,これを使ってアクセスするファイルを指定 する.

3.1.2 ファイルポインターのオープン

読み書きするファイルを開くためには,fopen()関数を使う.例えば,ファイル 「fuga.txt」からデータを読み込む場合,
	  hoge=fopen("fuga.txt", "r");

と記述する.最初にファイル名,そしてオープンモードを指定する.この間数の戻り値の 型は,FILE型のポインターである.オープンモードにつ いては,いろいろ用意されているが,諸君はとりあえず次の二つが分かればよい.

3.1.3 ファイルの読み書き

ファイルからデータを読み込むプログラムは,キーボードからデータを読み込むプログラ ムと似ている.また,ファイルへデータを書き込むプログラムは,ディスプレイに出力す るプログラムと似ている.

ファイルからデータの読み込みととキーボードからのデータ読み込みを並べて書くと

ファイル入力 int fscanf(ファイルポインター,書式指定,引数並び)
キーボード入力 int scanf(書式指定,引数並び)
となる.ファイルポインターを指定する以外,すべてキーボード入力の場合と同じである. 例えば,
	  fscanf(hoge, "%d%lf", &i, &d);
 

と書く.キーボードからデータを入力するのも,ファイルから 読み込むのも同じイメージで取り扱える.戻り値の整数は入力したデータの個数である. もし,ファイルの最後あるいは読み込みに失敗するとEOFを返す.

出力もまったく同じである.

ファイル出力 int fprintf(ファイルポインター ,書式指定,引数並び)
ディスプレイ出力 int printf(書式指定,引数並び)
例えば,プログラムは,次のように書く.
	  fprintf(hoge, "%d\t%f\n", i, d);
 

ハードディスクのファイルにデータを書き込むのは,ディスプレイにデータを出力するのと全く同 じイメージである.実際,ファイルの内容を見ると,ディスプレイと同じであることが分かる.戻り値の整数は出力した文字数である.書き込みに失敗すると負の値を返す.

3.1.4 ファイルのクローズ

使い終わったファイルは,fclose()関数を使って,クローズしなくてはならない.
	  fclose(hoge);

3.2 プログラム例

3.2.1 ファイル出力

ファイルにデータを書き出すプログラムの例として,三角関数の値を出力するプログラム をリスト2に示す.
   1 #include <stdio.h>
   2 #include <math.h>
   3 
   4 int main(void)
   5 {
   6   FILE *out_file;          // FILE型のポインターの宣言
   7   double x, y1, y2, y3;
   8   double dphi;
   9   int i, n;
  10   
  11   n = 360;
  12   
  13   dphi = 2*M_PI/n;
  14   
  15   out_file = fopen("trifunc.txt","w");     //ファイルのオープン
  16   
  17   for(i=0; i<n; i++){
  18     x=i*dphi-M_PI;
  19     y1 = sin(x);
  20     y2 = cos(x);
  21     y3 = tan(x);	  
  22     fprintf(out_file, "%e\t%e\t%e\t%e\n", x, y1, y2, y3);  //書き込み
  23   }
  24   
  25   fclose(out_file);                        //ファイルのクローズ
  26 
  27   return 0;
  28 }

\fbox{実行結果}
ファイル「trifunc.txt」の内容は,次の通り.
-3.141593e+00	-1.224606e-16	-1.000000e+00	1.224606e-16
-3.124139e+00	-1.745241e-02	-9.998477e-01	1.745506e-02
-3.106686e+00	-3.489950e-02	-9.993908e-01	3.492077e-02
-3.089233e+00	-5.233596e-02	-9.986295e-01	5.240778e-02
-3.071779e+00	-6.975647e-02	-9.975641e-01	6.992681e-02
-3.054326e+00	-8.715574e-02	-9.961947e-01	8.748866e-02
-3.036873e+00	-1.045285e-01	-9.945219e-01	1.051042e-01

   この辺は長いので省略

3.089233e+00	5.233596e-02	-9.986295e-01	-5.240778e-02
3.106686e+00	3.489950e-02	-9.993908e-01	-3.492077e-02
3.124139e+00	1.745241e-02	-9.998477e-01	-1.745506e-02

3.2.2 ファイル入力

リスト3に先ほど作成したファイル内容を読み込み,各列の2乗平均値を計 算する.
   1 #include <stdio.h>
   2 #include <stdlib.h>
   3 
   4 int main(void)
   5 {
   6   FILE *in_file;
   7   double x[500], y1[500], y2[500], y3[500];
   8   double sum2_x=0, sum2_y1=0, sum2_y2=0, sum2_y3=0;
   9   int i=0;
  10 
  11 
  12   in_file = fopen("trifunc.txt","r");
  13 
  14   while(fscanf(in_file, "%lf%lf%lf%lf",&x[i], &y1[i], &y2[i], &y3[i])!=EOF){
  15     sum2_x += x[i]*x[i];
  16     sum2_y1 += y1[i]*y1[i];
  17     sum2_y2 += y2[i]*y2[i];
  18     sum2_y3 += y3[i]*y3[i];
  19     i++;
  20   }
  21  
  22   fclose(in_file);
  23   printf("ave x^2=%f\n",sum2_x/i);
  24   printf("ave y1^2=%f\n",sum2_y1/i);
  25   printf("ave y2^2=%f\n",sum2_y2/i);
  26   printf("ave y3^2=%f\n",sum2_y3);
  27 
  28 
  29   return 0;
  30 }

\fbox{実行結果}
ave x^2=3.289919
ave y1^2=0.500000
ave y2^2=0.500000
ave y3^2=533454075936799969852241897062400.000000

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


no counter