fprintf(stdout, "data");は、標準出力ストリームと呼ばれるstdoutに"data"を出力しました。
stdoutは、コンソール画面へつながるストリームなので、画面に表示したわけです。
では、stdoutでなく指定するとどうなるのでしょうか?
例えば、あるファイルへつながるストリームです。
そうです! そうすると、ファイルに出力する(書き込む)ことになります。
そしてそのためには、希望のファイルにつながるstdoutに代わるトリーム管理用の変数が必要で、
そこにファイルをセットしなければなりません。
その変数の種類は (FILE *)型 で、stdio.hをインクルードすれば使えるようになります。
そして、希望のファイルへつながるストリームの取得にはfopen関数を使います。
これもstdio.hの中にプロトタイプ宣言があるので、これがインクルードしてあれば使えます。
以下に、具体的なプログラムを示します。
#include <stdio.h>
main()
{
FILE * fpw; /* ストリーム用変数 */
fpw = stdout; /* 標準出力 */
fprintf(fpw, "hello\n");
fprintf(fpw, " hello\n hello\n");
}
このプログラムは、fpwのストリームに3つのhelloを出力するプログラムです。
fpwのストリームがstdoutであれば、画面に表示するプログラムです。
次のように画面に表示します。
このfpwをに変更すると、どうなるでしょうか?
fopenで開いたファイルは、
fcloseで必ず閉じる必要があります。
オペレータの操作において、メモ帳で、
データを書き込む場合も、ファイルを開いて、最後に閉じる必要があることと同じです。
fopenの行の意味は、次のようになります。
相対パスを指定すると、この作品を実行した位置を基準にファイルを作ります。
なお、既にファイルがあって、そのファイルを別のプログラムが開いていると、fopenの処理は失敗します。
また絶対パス指定などで存在しないドライブやディレクトリを指定したり、
指定したディレクトリ内にファイル作る権限のない人が、実行した場合も失敗します。
このようにfopenの処理が失敗した場合は、0の値が戻り値として戻ります。
(よって、戻り値をifで評価して、エラーチェックするのが一般的です。)