为什么你会选择“a.out文件”而不是“a.out< file”,反之亦然? C ++

时间:2012-12-09 05:54:03

标签: c++ unix command-line

我想我很难理解差异。这很重要,因为用户如何知道在命令行输入什么内容?在命令行中, a.out文件用于文件处理,您需要显式打开该文件。 a.out<文件是重定向输入,您无需打开该文件。优点和缺点?

3 个答案:

答案 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'程序将读取命令行中指定的每个文件,或者如果命令行中没有指定文件则从标准输入读取,并将输出写入标准输出。此类过滤器的示例包括sortgrep。程序tr是纯粹过滤器的罕见例外之一;它只读取标准输入,只写入标准输出。

在命令行上接受文件名的好处是程序的单个调用可以读取多个文件;程序还可以识别每行输入来自哪个文件。读取标准输入的优点是您不必编写代码来打开文件。显然,有办法处理不读取文件的程序;例如,您可以使用cat来读取文件并将输出传递给程序的标准输入。缺点是程序无法判断任何给定行来自哪个文件(即使它是重定向的单个文件)。

因此,这两种符号通常不相同。两者都很有用。许多有用的程序都支持这两种符号。

答案 2 :(得分:-1)

如果您在程序中使用cin>>并且不想从键盘提供输入,请将其存储在文件(例如文件)中并使用./a.out < file。它被称为输入重定向。

./a.out file毫无意义。

./a.out < file > file_output表示从file获取输入并在file_output

中写出程序的输出