このサイトは更新終了し, こちらに移行しています。

C言語入門: ファイルの入出力

筑波大学農林工学系 奈佐原(西田)顕郎

ホーム


 前回の例で, 出力を画面に出すかわりに, リダイレクトによってファイルに出力することができた。このように, 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");
ファイルポインタfpに, "out.txt"という名前のファイルを割り当てる。"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というファイルポインタが欠かせないわけである。


ポイントがよくわからない人はここを見よう。

(ブラウザの「戻る」ボタンで戻ってください)