ショートカット
ファシリテーター × あり方
コーディングの向こう側
Hello, ANOTHER world!
オブジェクト指向のはなし
プログラミングのはなし
C言語実力診断クイズ
eSkillBooks
Hello, ANOTHER world!

printf の出力先

"Hello, world" では printf 関数や puts 関数を使って文字を出力します。文字はディスプレイ上に表示されます。では、これらの関数はディスプレイに文字を表示するための関数なのでしょうか?
こういうときは、C言語のリファレンスマニュアルを見てみましょう。printf のページを見ると、「・・・を標準出力ストリームに出力する」とあります。また「第1引数に stdout を伴う fprintf と等価である」とあります。
プロトタイプは次の通りです。
int printf( const char *format, ... );
「標準出力ストリーム」という言葉が気になりますね。では fprintf のページを見てみましょう。プロトタイプは次の通りです。
int fprintf( FILE *stream, const char *format, ... );
fprintf の説明には「・・・をストリーム *stream に出力する」とあります。なるほど、FILE 型を「ストリーム」と呼ぶようです。そしてその特別な形式 stdout が標準出力ストリームと呼ばれるようです。
今度は puts を見てみると、同様に fputs という関数の説明があり、それらのプロトタイプは次のようになっています。
int puts( const char *string );
int fputs( const char *string, FILE *stream );
つまりこういうことです。ストリームへの出力を行う関数 fprintfの出力先として標準出力ストリーム stdout を指定した特別版が printfである。fputs と puts の関係も同様。
「ストリーム」とは、その言葉の意味の通り「データの流れ」のことです。ファイル入出力を先頭から末尾に向かって順番に行うときや、2台のマシンで通信するときや、キーボードから1文字ずつ入力するときのように、データが1列になって並んでいるような流れのことを言います。
「標準出力ストリーム」というのは、いつでも使える標準的なストリームのひとつで、出力専用です。普通はディスプレイに接続されていて、ここに出力した文字は順番に画面に表示される仕組みになっています。それで、printf や puts に渡した文字列が画面にあらわれるのです。

実は、stdout を含めて「標準ストリーム」は3つあります。

  • stdin:標準入力ストリーム
    (通常はキーボードにつながっている)
  • stdout:標準出力ストリーム
    (通常はディスプレイにつながっている)
  • stderr:標準エラー出力ストリーム
    (通常はディスプレイにつながっている)
どれも FILE * 型であり、main 関数が呼ばれたときにはセッティングが完了していて使える状態になっています。そう、以前に説明した「初期化処理ルーチン」でこのセッティングが行われるのです。
これら3つのストリームはもっとも標準的なもので、ほとんどの環境に備わっています。場合によってはこれら以外のストリームが使えるようになっています。たとえばその環境で標準的に使用されるプリンタへの出力などが考えられます。
さて、もちろん「標準でない」ストリームというのもあります。fprintf や fputs などの "f" がつく関数群がそのためのもので、こういうストリームを通常は「ファイルストリーム」と言います。

("Hello, ANOTHER world!" は2001年11月から2002年11月にかけて作成されたコンテンツです。)