違いを理解するのに苦労していると思います。これは重要です。なぜなら、ユーザーはコマンド ラインで何を入力すればよいかを知ることができるからです。コマンド ラインでは、.out ファイルは、ファイルを明示的に開く必要があるファイル処理用です。a.out < fileはリダイレクトされた入力であり、ファイルを開く必要はありません。長所と短所?
3 に答える
Stdin は、次のように、あるプログラムの出力を別のプログラムの入力などにパイプでつなげたい場合に特に便利です。
cat myfile.txt | grep MyKeyword | wc -l
(文字列 MyKeyword を含む myfile.txt の行数を出力します)
「grep」および「wc」ユーティリティが、stdin からではなく、指定されたファイルからのみ読み取るように設定されている場合、上記のタスクはより困難になります。代わりに複数のステップでそれを行う必要があります:
grep MyKeyword myfile.txt > temp.txt
wc -l temp.txt
rm temp.txt
...これは厄介で、一時ファイルをディスクに書き込む必要もあり、問題が発生する可能性があります (たとえば、現在のディレクトリに temp.txt ファイルが既に存在する場合はどうなるでしょうか?おっと、それを上書きしただけです。残念です!または、ドライブへの書き込みアクセス権がない場合はどうなりますか?その場合、一時ファイルを書き出す方法はありません)
一方、プログラムで複数のファイルから読み取る必要がある場合もあります。たとえば、複数のファイルを連結したい場合は、次のようにします。
猫 part1.txt part2.txt part3.txt > まるごと.txt
「cat」が stdin からの読み取りのみをサポートしている場合、複数のファイルを cat の stdin ストリームにパイプする何らかの方法が必要になるため、そのようなことを行うのは困難です。
また、プログラムがファイルを非線形の順序で読み取る必要がある場合 (たとえば、fseek() でファイルを直接読み取るのではなく、前後に読み取るなど)、stdin を使用してそれを行うことはできません。 t パイプをシークします。
「フィルター」プログラムがコマンドラインで指定された各ファイルを読み取るか、コマンドラインで指定されたファイルがない場合は標準入力から読み取り、出力を標準出力に書き込む標準的な Unix イディオムがあります。このようなフィルタの例はsort
、 およびgrep
です。このプログラムtr
は、純粋なフィルターであるまれな例外の 1 つです。標準入力のみを読み取り、標準出力にのみ書き込みます。
コマンド ラインでファイル名を受け入れる利点は、プログラムの 1 回の呼び出しで複数のファイルを読み取ることができることです。プログラムは、入力の各行がどのファイルからのものかを識別することもできます。標準入力を読み取る利点は、ファイルを開くためのコードを記述する必要がないことです。明らかに、ファイルを読み取らないプログラムを処理する方法はいくつかあります。たとえば、cat
ファイルを読み取り、出力をプログラムの標準入力にパイプするために使用できます。欠点は、プログラムが特定の行がどのファイルから来たかを判別できないことです (リダイレクトされた単一のファイルであっても)。
したがって、この 2 つの表記法は一般に等価ではありません。どちらも便利です。多くの便利なプログラムが両方の表記をサポートしています。
プログラムでを使用cin>>
していて、キーボードからの入力を提供したくない場合は、それをファイル (たとえばファイル) に保存して使用します./a.out < file
。これは入力リダイレクトと呼ばれます。
./a.out file
何も意味しません。
./a.out < file > file_output
file
から入力を受け取り、プログラムの出力を書き込むことを意味しますfile_output