ファイルからの読み取り

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をインクルードすることで使えます。