ホーム » 2014 » 7月 » 22

日別アーカイブ: 2014年7月22日

2014年7月
« 6月   8月 »
 12345
6789101112
13141516171819
20212223242526
2728293031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

パイプ処理

前回の授業では、標準出力・標準入力・入力リダイレクト・出力リダイレクトなどの説明を行った。 今回は、この考え方をさらに応用したパイプ(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