標準入出力

リダイレクション

プログラムがデータを読み込む標準的なストリームを 標準入力という。以下の簡単なプログラムを動かす場合を考える。

happy.c

#include <stdio.h>

int main()
{
  char buf[50], name[50];
  printf("あなたの名前は?: ");
  fgets(buf, sizeof buf, stdin);
  sscanf(buf, "%19s", name);
  printf("%sさん、なんだかしらないけど、おめでとう!\n", name);
}

fgetsでデータを読み込む場合、入力ストリームとして stdinを指定すると標準入力からデータを読み込む。標準入力は

./happy

と起動した場合、キーボードからの入力になり、

./happy < file

と起動した場合、file からデータを読み込む。このように 標準入力をファイルからの入力に切り替えることをリダイレクション という。逆に、標準出力をファイルに切り替えることもリダイレクションという。

普通に起動すると、

./happy
あなたの名前は?: 太郎
太郎さん、なんだかしらないけど、おめでとう!

のようにprintfによる出力は端末(画面)に行なわれるが、 出力リダイレクションを使うと、

./happy > output
太郎
cat output
あなたの名前は?: 太郎さん、なんだかしらないけど、おめでとう!

のように、本来端末に出るはずの出力が、全て指定したファイルに向けられる。

また、リダイレクト記号として >> を使うと 出力をファイルに追加できる。

./happy > output
太郎
./happy >> output
花子
cat output
あなたの名前は?: 太郎さん、なんだかしらないけど、おめでとう!
あなたの名前は?: 花子さん、なんだかしらないけど、おめでとう!

パイプ

ひとつのコマンドの標準出力を、別のコマンドの標準入力に することもできる。wc コマンドは、標準入力からデータを読み 読み込んだデータの「行数」、「単語数」、「文字数」を表示する。

wc
What is this?
This is a pen.
Oh, thank you very much!
C-d
       3      12      54

当月分のカレンダーを出力するプログラムcalの出力を wcに与えると、カレンダー出力の行数・単語数・文字数が分かる。

cal
   November 2003
 S  M Tu  W Th  F  S
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
cal | wc
       8      39     146

cal コマンドの出力がそのままwcコマンドの入 力に繋がっていることが分かる。このように、二つのコマンドの標準出力と 標準入力を繋ぐことをパイプといい、コマンドラインでは パイプ記号「|」で二つのコマンドを繋ぐことによって 指定する。パイプは何段にも繋げることができる。

なんらかのデータを読み、それを加工したり選別したりする働きをするプロ グラムは、データ入力を標準入力から、データ出力を標準出力へ行なうように作っ ておくことで、他のプログラムとのデータのやりとりをパイプを介して行なう 事ができる。標準入出力を利用して様々なデータ処理を行なうプログラム のことをフィルタプログラムと呼ぶ。


目次