我想我很难理解差异。这很重要,因为用户如何知道在命令行输入什么内容?在命令行中, a.out文件用于文件处理,您需要显式打开该文件。 a.out<文件是重定向输入,您无需打开该文件。优点和缺点?
答案 0 :(得分:2)
当您希望能够将一个程序的输出传递给另一个程序的输入时,Stdin特别有用,在链中也是如此,如下所示:
cat myfile.txt | grep MyKeyword | wc -l
(将打印myfile.txt中包含字符串MyKeyword的行数)
如果“grep”和“wc”实用程序设置为仅从指定文件读取,而不是从stdin读取,则上述任务将更加困难;你必须在多个步骤中完成它:
grep MyKeyword myfile.txt > temp.txt
wc -l temp.txt
rm temp.txt
...这会很尴尬,也需要在磁盘上写一个临时文件,这可能有问题(例如,如果当前目录中已经有一个temp.txt文件怎么办?哎呀,你刚刚覆盖了它糟糕!或者如果你没有对驱动器的写访问权限呢?没办法写出临时文件呢)
另一方面,有时您的程序需要从多个文件中读取。例如,如果要将多个文件连接在一起,可以执行以下操作:
cat part1.txt part2.txt part3.txt> wholething.txt
如果“cat”仅支持从stdin读取,那么就很难做到这一点,因为你需要某种方法将多个文件传输到cat的stdin流中。
另外,如果程序需要以非线性顺序读取文件(例如fseek()在文件中向前或向后读取而不是直接读取它),那么使用stdin就无法做到这一点,因为你不能在管道上寻找。
答案 1 :(得分:0)
有一个标准的Unix习惯用法,其中'filter'程序将读取命令行中指定的每个文件,或者如果命令行中没有指定文件则从标准输入读取,并将输出写入标准输出。此类过滤器的示例包括sort
和grep
。程序tr
是纯粹过滤器的罕见例外之一;它只读取标准输入,只写入标准输出。
在命令行上接受文件名的好处是程序的单个调用可以读取多个文件;程序还可以识别每行输入来自哪个文件。读取标准输入的优点是您不必编写代码来打开文件。显然,有办法处理不读取文件的程序;例如,您可以使用cat
来读取文件并将输出传递给程序的标准输入。缺点是程序无法判断任何给定行来自哪个文件(即使它是重定向的单个文件)。
因此,这两种符号通常不相同。两者都很有用。许多有用的程序都支持这两种符号。
答案 2 :(得分:-1)
如果您在程序中使用cin>>
并且不想从键盘提供输入,请将其存储在文件(例如文件)中并使用./a.out < file
。它被称为输入重定向。
./a.out file
毫无意义。
./a.out < file > file_output
表示从file
获取输入并在file_output