stdinは、キーボードからの情報の流れを取得するもので 標準入力と呼ばれるストリームでした。 これも、データの種類はstdoutと同じで FILE * 型の変数で管理できます。
int 型変数のd に、キーボードから入力した10進の文字情報の流れを、数値に変換して記憶させる場合、
次のように表現できます。
fscanf(stdin, "%d" , & d);
これは、通常のstdinが、コンソール画面のキーボードからくる情報のストリームにつながっているため、
キーボードから入力できるわけです。
このstdinの代わりに、あるファイルへつながるストリームを指定すると、そのファイルから
情報を読むことになります。
そのためには、stdinに代わって、希望のファイルにつながるトリーム管理用の変数(FILE *)型 が必要で、
そこにファイルをセットしなければなりません。
(FILE *)型 は、stdio.hをインクルードすれば使えるようになります。
そして、希望のファイルへつながるストリームの取得にはfopen関数を使います。
これもstdio.hの中にプロトタイプ宣言があるので、これがインクルードしてあれば使えます。
以下に、具体的なプログラムを示します。
#include <stdio.h>
main()
{
int d, d21, d22; /* 入力データ記憶用 */
int n, n2; /* fscanfの戻り値記憶用 */
FILE * fpr; /* 入力用ストリーム管理変数 */
fpr = stdin; /* 標準入力 */
n = fscanf(fpr,"%d", &d);
n2 = fscanf(fpr,"%d %d", &d21, &d22);
printf("%d, %d, %d\n", d, d21, d22);
}
このプログラムは、fprストリームから3つ10進整数と判断できるデータを取得後、
それを表示するプログラムです。
正しい入力であれば、fscanfで入力した変数の個数が戻り値になって、n に1, n2に2が記憶されます。
このfprをにすると、どうなるでしょうか?
fopenで開いたファイルは、
fcloseで必ず閉じる必要があります。
オペレータの操作において、メモ帳でファイルを開いた場合に、終わったら閉じる必要があることと同じです。
fopenの意味は、次のようになります。
相対パスを指定すると、この作品を実行した位置を基準にファイルが指定されます。
上記であれば、この実行可能ファイルと同じディレクトリにtest.txtのファイルが、存在してなくてはなりません。
(Visual Studio .NET 2003 の環境で実行させる場合は、そのフォルダの中にtest.txtがないとエラーになります。)
指定したフィルが存在しないと、fopenは失敗を意味する0の戻り値になります。
このようにfopenの処理が失敗した場合は、0の値が戻るので、
これをifで評価して次のように、失敗した場合の処理をプログラムするのが一般的です。
この例では、エラーメッセージを出して終了しています。
fpr = fopen( "test.txt" , "r"); if( fpr == NULL ) { fprintf(stdout, "ファイルオープン失敗\n"); exit(1); /* プログラム強制終了 */ }
上記では失敗の判定で fpr == 0 の代わりに
fpr == NULL と書いていますが、
この表現が一般的です。
NULLは、stdio.hの中で0が割り当てられる識別子です。
なお、exit(1);はプログラムを強制終了する関数で、stdlib.hをインクルードすることで使えます。