リスト1や2のプログラムの中で,これらの約束事の記述 の例を図3に示す.人間の動作を考えれば,取 り立ててその流れは難しくない.
図3を見て分かるように,実際のC言語ではオープン と読み書き,クローズの他に,ファイルポインターの宣言が必要であ る.ファイルポインターについては,次の節で述べることにする.C言語のプログラムで ファイル処理をする場合は,図4に示す手順に従えば良い. ただし,実際のプログラムではエラー処理を書かなくてはならないが,ここでは示してい ない.
このファイルポインター(fp)を使って,全てのファイル関係の処理を行う.なにせ, ファイルに関する情報が全て書かれているので,これを指定すれば,あとはコンピューター が勝手に処理してくれる.面倒くさい処理はコンピューター任せにして,プログラマーは 楽をしようということである.このFILE型の変数(ポインター)を使うためには,次 のように宣言する.
FILE *hoge;これで,FILE型の変数(ポインター)hogeを宣言できる.ただし,hogeは変数名なので プログラマーが適当な名前をつける.
FILE *fopen(char *filename, char *openmode)戻り値はFILE型のポインター,ファイル名を表す第一引数はchar型のポインター,オープ ンモードを表す第2引数はchar型のポインターと言うことである.もし,オープンに失敗 すると,NULLという戻り値になる.char型のポインターと難しいことを言っているが, 先のプログラムの例(リスト1, 2)でも分かるように,文 字列をダブルクォーテーションで囲めば良いのである.例えば,hoge.txtというファイル を読み込みモードでオープンする場合
foo=fopen("hoge.txt", "r");
オープンモードについては,いろいろ用意されており,教科書のp.360にまとめてある. 細かいファイル処理をする場合は,これらのモードを巧みに使う必要があるが,本講義で は,
int fclose(FILE *filepointer)戻り値は,int型で,クローズに成功すると0,失敗するとEOFが返される.引数は,ファ イルポインターのみである.ファイルを開いたら閉じるのが礼儀だと心得て,処理の最後 に
fclose(foo);と必ず書く.
まず,入力であるが,一般のファイルと標準入力の場合を並べて書くと
となる.ファイルポインターを指定する以外,すべて標準入力の場合と同じである.非常 に単純で簡単である.実際の動作もキーボードからデータを入力するのも,ファイルから 読み込むのも同じイメージで取り扱える.戻り値の整数は入力したデータの個数である. もし,ファイルの最後あるいは読み込みに失敗するとEOFを返す.
ファイル入力 int fscanf(ファイルポインター,書式指定,引数並び) 標準入力 int scanf(書式指定,引数並び)
出力もまったく同じである.
ハードディスクのファイルにデータを書き込むのは,ディスプレイにデータを出力するのと全く同 じイメージである.実際,ファイル出力されたデータを見ると,ディスプレイと同じであ ることが分かる.戻り値の整数は出力した文字数である.書き込みに失敗すると負の値を返す.
ファイル出力 int fprintf(ファイルポインター ,書式指定,引数並び) 標準出力 int printf(書式指定,引数並び)
これまでから,コンソール入出力(キーボード入力とディスプレイ出力)とファイル入出力 は同じ取り扱いができることが理解できたであろう.
リスト3に三角関数の値をファイル出力するプログラムを示す.
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 }
リスト4に先ほど作成したファイル内容を読み込み,各列の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 }