リスト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 }