C言語入門6. ファイルの入出力
<C言語入門に戻る>
C言語入門2. 繰り返し処理で, 出力を画面に出すかわりに, リダイレクトによってファイルに出力することができた。このように, Unixの上でプログラミングをしたり解析したりするときは, データの入出力にリダイレクトを活用するのが合理的である。なぜなら, リダイレクト可能ということはすなわち標準入出力とのやりとりを行なうということなのだから, 他の標準入出力の機能の利用, 特にパイプによって複数のプログラムと結合することができるからである。
しかし, 標準入出力を使わないで, じかに, 特定のファイルとデータをやりとりしたいということもよくある。特に, 複数のファイルからデータを読んだり複数のファイルへ出力したりということをやろうとすると, 標準入出力では実現できない。
ここでは, 標準入出力を使わないで, じかに, 特定のファイルとデータをやりとりする方法を学ぼう。例として, 0から9までの整数を出力するプログラムを考える:
/* number.c */ /* 2008/07/15 K. Nasahara */ # include <stdio.h> main() {short i; for (i=0; i<10; i++) printf("%d\n", i); }
このプログラムをコンパイルして実行したら, 画面に0から9までの数字があらわれる。これをファイルにリダイレクトすれば, 0から9までの数字が並んだテキストファイルができる:
$ ./number > result.txt
しかしここでは, このプログラムを改造して, 直接, out.txtというファイルに出力してみよう。改造箇所は, mainの部分であり, 以下のようにしてみよう:
main() {short i; FILE *fp; fp=fopen("out.txt", "wt"); for (i=0; i<10; i++) fprintf(fp, "%d\n", i); fclose(fp); }
これをコンパイルし, 実行すれば, out.txtというファイルができて, その中には0から9までの数字が書き込まれていることがわかる。
上の改造箇所を解説しよう。まず, ファイルを扱うために, ファイルポインタというものを用意してやる必要がある。ファイルポインタは, プログラム内における, ファイルの分身みたいなものである。プログラムの中で, 何かをファイルに書き込みたいときは, そのファイルのファイルポインタを指定して, 「そこに書け」と命令する。何かをファイルから読み込みたい時も, そのファイルのファイルポインタを指定して, 「そこから読め」と命令する。
ファイルポインタを用意しているのは, 上の改造箇所の,
FILE *fp; fp=fopen("out.txt", "wt");
という2行である。FILE *fp; で, fpという名前で「ファイルポインタ型変数」がひとつ用意された。このへん, 今はあんまり深く意味を考えなくてよい。FILEはなんで大文字?とか, *はどういう意味?とか, そういう疑問はそのうち大人になったらわかるので, 今はスルーしよう。次の行の, fp=fopen("out.txt", "wt");で, fpというファイルポインタに, out.txtという名前のファイルが対応づけられた。以後, このプログラムの中では, out.txtというファイルはfpというファイルポインタとして扱われる。"wt"は, 「テキストを書き込む」というモードを指定する。
for (i=0; i<10; i++) fprintf(fp, "%d\n", i);
ファイルへの書き込みでは, printfのかわりにfprintfを使う。fprintfの第一引数は, 出力先のファイルポインタ。
fclose(fp);
ファイルの入出力がおわったら, ファイルポインタを解放する。
標準入出力のファイルポインタ
実は, 標準入出力も, 一般のファイルと同じように, Cプログラムのなかでファイルポインタで指定することで, あたかもファイルのようにあつかうことができる。標準入力のファイルポインタはstdin, 標準出力のファイルポインタはstdoutである。これらは宣言したりfopen, fcloseなどをする必要はない。
ためしに, 上のプログラムで, fprintfの中のfpをstdoutにかえてコンパイル・実行してみよ。
printfやscanfを使えば, わざわざ標準入出力のファイルポインタなどを使わなくてもいいじゃないかと思うかもしれない。それはそのとおりである。しかし, Cの関数として, バイナリファイルを入出力する, freadやfwriteという関数があり, これらは画像解析や偏微分方程式の解析などで非常によく使われるが, これらの関数は, 必ずファイルポインタを指定しなければならない。そのような関数に対して標準入出力を割り当てる場合に, stdinやstdoutというファイルポインタが欠かせないわけである。
参考になるサイト
ポインタがよくわからない人はここを見よう。
<C言語入門に戻る>
Keyword(s):
References:[C言語入門]