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