パイプ処理
前回の授業では、標準出力・標準入力・入力リダイレクト・出力リダイレクトなどの説明を行った。 今回は、この考え方をさらに応用したパイプ(unixパイプ)について説明する。
入力リダイレクトや出力リダイレクトでは、 ファイルという概念では、キーボードの入力とファイルからの入力、画面への出力とファイルへの出力が 同じように扱えるため、プログラム起動時にリダイレクトを設定すれば、簡単に切り替えられることを説明した。
しかし、ファイルでは、他のプログラムからの出力を入力として使ったりすることもできる。
例えば、以下の様な、名前と複数科目の点数のファイルがあって、各人の平均点を求めるプログラムがあったとする。
(( mean3.c )) #include <stdio.h> void main() { char name[ 100 ] ; int point[ 3 ] ; while( scant( "%s%d%d%d" , name , &point[0] , &point[1] , &point[2] ) == 4 ) { printf( "%s %lf" , name , (point[0]+point[1]+point[2]) / 3.0 ) ; } }
さらに、名前と点数のデータから、全員の平均点を求める以下のプログラムがあったとする。
(( mean-all.c )) #include <stdio.h> void main() { char name[ 100 ] ; int count = 0 ; double sum = 0.0 , p ; while( scant( "%s%lf" , name , &p ) == 2 ) { sum += p ; count ++ ; } printf( "%lf" , sum / count ) ; }
この時点で、名前と3教科のデータが入ったファイルがあったならば、以下の様に実行すれば、 画面に全員の平均点が表示される。
$ mean3.exe < data.txt > data-a.txt $ mean-all.exe < data-a.txt
しかし、各人の平均点の中間結果を data-a.txt に保存しなくても、 以下の様なパイプで処理を起動すると、一度に 結果を確認できる。
$ mean3.exe < data.txt | mean-all.exe