我想我很难理解其中的差异。这一点很重要,因为用户如何知道在命令行中键入什么?在命令行中,a.out文件用于需要显式打开文件的文件处理a.out<文件是重定向输入,您不需要打开该文件。利弊
Stdin在您希望能够将一个程序的输出管道连接到另一程序的输入时特别有用,以此类推,如下所示:
cat myfile.txt | grep MyKeyword | wc -l
(它将打印出myfile.txt中包含字符串MyKeyword的行数)
如果"grep"one_answers"wc"实用程序设置为仅从指定文件读取,而不是从stdin读取,那么上述任务将更加困难;你必须分多个步骤来做:
grep MyKeyword myfile.txt > temp.txt
wc -l temp.txt
rm temp.txt
另一方面,有时您的程序需要从多个文件中读取。例如,如果你想将几个文件连接在一起,你可以这样做:
cat part1.txt part2.txt part3.txt>wholething.txt
如果"cat"只支持从stdin读取,那么很难做到这一点,因为您需要某种方法将多个文件通过管道传输到cat的stdin流中。
此外,如果程序需要以非线性顺序读取文件(例如,在文件中向前或向后读取fseek(),而不仅仅是直接读取),则无法使用stdin来完成此操作,因为您无法在管道上进行搜索。
有一个标准的Unix习惯用法,"filter"程序将读取命令行上指定的每个文件,或者如果命令行上没有指定文件,则从标准输入读取,并将输出写入标准输出。这样的滤波器的例子是sort
和grep
。程序tr
是一个罕见的例外,它是一个纯过滤器;它只读取标准输入,只写入标准输出。
在命令行上接受文件名的优点是,对程序的单个调用可以读取多个文件;程序还可以识别每一行输入来自哪个文件。读取标准输入的优点是不必编写代码来打开文件。显然,有一些方法可以处理不读取文件的程序;例如,可以使用cat
读取文件并将输出通过管道传输到程序的标准输入。缺点是,程序无法判断任何给定行来自哪个文件(即使是重定向的单个文件)。
因此,这两种符号通常是不等价的。两者都很有用。许多有用的程序都支持这两种符号。
如果您在程序中使用cin>>
,并且不想从键盘提供输入,则将其存储在一个文件(比如文件)中并使用./a.out < file
。它被称为输入重定向。
./a.out file
没有任何意义。
./a.out < file > file_output
表示从file
获取输入并将程序的输出写入file_output