| ファイルもストリームとして扱うことができます。テキストファイルの中身を先頭から順番に読み書きする場合がそうです。ファイルから読み込む場合は「入力ファイルストリーム」、書き出す場合は「出力ファイルストリーム」を使います。 | ||
| ファイルをストリームで操作するためには、そのファイルをストリームと「つなげる」必要があります。よく「ファイルをオープンする」と言いますが、それはこの「つなげる」作業のことを言っているのです。ファイルをオープンするための fopen という標準関数が用意されているのは知っていますよね。例えばオープンモードを「出力」として(パラメータに "w" などを指定して)fopen を呼び、ファイルを出力ストリームとつなげてしまえば、あとは printf や puts などで標準出力ストリームに文字を表示するのと同じような感じで fprintf や fputs を使ってファイルにテキストを書き込むことができます。 | ||
![]() |
||
| fopen の戻り値は FILE * 型です。FILE は構造体で、その中にはストリームの仕組みが隠されています。実際に中身がどうなっているのかは使っている環境によって違うのですが、とにかくストリームの形をしています。それで、FILE * 型の変数を通してストリームを扱うことができます。 | ||
| ところで stdout などの標準ストリームの型も FILE * でした。これは、ファイルストリームと標準ストリームが同じサブルーチンで扱えるということです。実際、printf は fprintf の特別バージョンだったことを思い出してください。ストリームを扱うサブルーチンは、一工夫すれば使い道がだいぶ広がります。 | ||
| 例えば、テキストを画面に表示するために次のような関数を作ったとしましょう。この関数の中ではパラメータとして与えられた文字列を適当に加工し、printf などを使って標準出力に出力しています。 | ||
|
||
| でも、これではファイルを扱うことができません。そこで、ちょっと工夫するわけです。次のような、FILE * 型のパラメータを引数に取る関数を作ります。この関数の中では fprintf などを使ってテキストを出力します。すると、標準出力ストリームも出力ファイルストリームも同じように扱うことができます。 | ||
|
||
| そうしておいて、上記の OutputMessage 関数の中では printf などを使うのをやめて、OutputMessageToStream 関数を呼ぶようにします。もちろん、そのときに stdout をパラメータにします。 | ||
| これで、ファイル出力と画面表示の両方を同じ仕組みで扱うことができるようになりました。今まで画面に出していたメッセージをファイルに記録するように変更したくなったりしても、すぐに対応できるわけです。画面とファイル両方というのもできますね。それに、はじめからこういう形で作れば似たような内容のプログラムを何度も書かずに済むので楽です。 | ||
| 上の例のような「関数を共通化する」という考え方は、ストリームに限らずいろいろな場面で使うことができます。こういうことをあまりやったことがない人は、練習だと思って、いちどやってみるといいかもしれません(例えば、出力先を画面にするかファイルにするかを簡単に切り替えられる "Hello, world" を作ってみましょう)。 | ||
("Hello, ANOTHER world!" は2001年11月から2002年11月にかけて作成されたコンテンツです。)