リダイレクトとパイプ
ファイルの話はほぼ終わったので、リダイレクトとパイプについて説明を行う。
標準入出力とリダイレクト
以下のプログラムは、先週バッファリングの説明のために示した、 入力の小文字を大文字に変換して出力するプログラム。 まずは、このプログラムを保存し、実行プログラム”upper.exe”を 起動し、バッファリングが使われていることを再確認。
#include <stdio.h> int main() { int c ; while( (c = getchar()) != EOF ) { if ( c >= 'a' && c <= 'z' ) c = c - 'a' + 'A' ; putchar( c ) ; } return 0 ; }
標準入力とは、通常キーボードに割り当てられているが、 通常のOSでは、入力をプログラム起動時にファイルに切り替えて実行することができる。
((コマンドプロンプトを開いて、)) ((upper.c と同じディレクトリに入る。)) $ upper.exe This is a pen. THIS IS A PEN. ^C $ upper.exe < upper.c #INCLUDE INT MAIN(){ :
ファイルに切り替えて実行するには、 “<“マークの後ろにキー入力の代わりのファイルを書けばいい。 この様な機能を”入力リダイレクト”と呼ぶ。
出力リダイレクト
同じように、通常ディスプレイに割り当てられているが、 プログラム起動時に出力を画面でなくファイルに保存するように実行するには、 “>”マークの後ろに保存先のファイル名を書けば良い。 このような機能を”出力リダイレクト”と呼ぶ。
((出力リダイレクト)) $ upper.exe > out.txt This is a pen. That is a pencil. ^C $ type out.txt THIS IS A PEN. THAT IS A PENCIL. ((入力リダイレクトと出力リダイレクト)) $ upper.exe < upper.c > out.txt $ type out.txt #INCLUDE :
出力リダイレクトの際に、”>> ファイル名” を付けた場合は、 追記モードで書き込みが行われる。
$ echo "abc" > out.txt $ type out.txt abc $ echo "def" >> out.txt abc def
パイプ
入力リダイレクトでは、標準入力をデフォルトのキー入力をファイル入力に 簡単に切り替えることができる。 同様に、出力リダイレクトでは、標準出力の画面を、ファイル出力に 簡単に切り替えることができる。 言い方を変えれば、キー入力や画面出力とファイル入出力を、 同じ概念で操作できる所が大きな特徴。 これと同じように、プログラムの出力と別のプログラムの入力も、 区別なく使うことができたらさらに便利ではないか?
((リダイレクトでabcdeを大文字変換)) $ echo "abcde" > out.txt $ upper.exe < out.txt ABCDE ((上記作業を一発で実行)) $ echo "abcde" | upper.exe ABCDE
この例では、echo プログラムの出力をそのまま upper.exe の標準入力に渡し、 そのupper.exe の標準出力として、ABCDEが画面に表示されている。 プログラム起動時の”|”がパイプで、左側のプログラムの標準出力を 右側のプログラムの標準入力に渡している。
パイプの話の延長として、WebのCGIプログラムではパイプが使われていることや、 フィルタプログラムを組み合わせれば複雑なプログラムを書かなくていいなどを説明する。 また、フィルタプログラムでは、処理中に発生したエラーの警告をprintfで出力すると、 警告メッセージが次のプログラムに送られてしまい、確認ができなくなったり、 警告メッセージのデータを処理できなくなる。このために、標準エラー出力という ものがあることを説明する。