標準入力・標準出力・リダイレクト・パイプ
通常、プログラムを動かすと、scanf()の入力はキーボード、printf()の出力は画面となっている。 しかしunixなどでは、入出力の対象がキーボードか画面かファイルかプログラム入出力といった区別なくファイル(FILE)を使って読み書きができるようになっている。
標準入力は、通常の起動ではキーボードに割り当てられているが、 起動時に入力リダイレクトなどを使うと、ファイルから読み込むこともできる。 標準出力は、通常は画面に出力されるようになっているが、 起動時に出力リダイレクトなどを使うと、ファイルに書きこむこともできる。 標準入力や標準出力を使ってプログラムを書いておけば、 fopenなどを使わずに簡単でかつ、後で処理対象の入力元(あるいは出力先)を 切り替えることが簡単にできるようになる。
例題として、以下のように標準入力のデータを大文字に変換して 標準出力に出力するプログラムを作る。
// このプログラムをupper.cで // 保存し、コンパイル結果を upper.exe とする #include <stdio.h> void main() { int c ; while( (c = getchar()) != EOF ) { if ( c >= 'a' && c <= 'z' ) c = c-'a' + 'A' ; putchar( c ) ; } }
入力リダイレクトや出力リダイレクトを用いた作業例を以下に示す。
Z:> upper.exe This is a pen. THIS IS A PEN. That is a pencil. THAT IS A PENCIL. ^Z ←入力データがこれで終わり(unixなら^D) Z:> upper.exe < upper.c ←入力リダイレクト #INCLUDE <STDIN.H> : Z:> upper.exe > out.txt ←出力リダイレクト This is a pen. That is a pencil. ^Z ←入力データがこれで終わり(unixなら^D) Z:> type out.txt THIS IS A PEN. THAT IS A PENCIL.
入出力のリダイレクトでは、標準入出力をファイルからに変更できたが、 パイプを使えば、別のプログラムの出力を標準入力として利用したり、 プログラムの標準出力を別のプログラムの入力とすることもできる。
簡単な例として、echo コマンドは、引数をそのまま標準出力に出力する。 これを先のupper.exe と使うと、以下のようにできる。
Z:> echo "This is a pen." This is a pen. Z:> echo "This is a pen." | upper.exe THIS IS A PEN.
上記の例は、以下の入力リダイレクト出力リダイレクトとほぼ同じである。 中間ファイルを使わない点でパイプの方が単純…
Z:> echo "This is a pen." > temp.out Z:> upper.exe < temp.out