来自http://www.cplusplus.com/reference/iostream/cout/:
默认情况下,大多数系统都将其标准输出设置为控制台,其中显示了文本消息,但通常可以重定向。
我从未听说过一个系统,其中stdout
不是控制台窗口,默认情况下或其他方式。我可以看到在打印是一项昂贵的操作的系统中如何重定向它可能是有益的,但这在现代计算机中应该不是问题,对吧?
答案 0 :(得分:14)
当然可以。我可能想要将标准重定向到文本文件,另一个进程,套接字等等。
默认情况下它是控制台,但是有多种原因需要重定向它,最有用的(与Unix哲学同步)是将一个程序的输出重定向到另一个程序的输入。这允许人们创建许多小型,轻量级的程序,这些程序相互馈送并作为较大系统的离散部分工作。
基本上,它只是一种简单而强大的共享数据机制。由于我上面提到的原因,它在* nix系统上更受欢迎,但它也适用于Windows。
答案 1 :(得分:8)
在大多数系统上,您可以将标准输入/输出/错误重定向到其他文件描述符或位置。
例如(在Unix上):
./appname > output
将stdout从appname重定向到名为output的文件。
./appname 2> errors > output
将stdout
重定向到名为output的文件,将stderr
中的所有错误重定向到名为errors的文件。
在unix系统上,您还可以让程序打开文件描述符并将其指向stdin
,例如:
echo "input" > input
cat input | ./appname
这将导致程序从管道中读取stdin
。
这就是在unix中你可以将各种不同的实用程序“管道”在一起以创建一个更大的工具。
find . -type f | ./appname | grep -iv "search"
这将运行find
命令,并将其输出并将其输入./appname,然后appname
的输出将被发送到grep
的输入,然后搜索对于“搜索”一词,只显示匹配的结果。
它允许许多小型实用程序产生非常强大的效果。
将>
,<
和|
视为管道。
>
就像水槽中的排水管一样,它接受数据并将其存储在您想要放置的位置。当shell遇到>
时,它将打开一个文件。
> file
当shell看到上述内容时,它将使用标准系统调用open
文件,并记住该文件描述符。在上述情况下,由于没有输入,它将创建一个空文件,并允许您键入更多命令。
banner Hello
这个命令用非常大的字母将Hello写入控制台,并使其滚动(我在这里使用Unix,因为它是我最熟悉的)。输出只是写入标准输出。使用“接收器”(>
),我们可以控制输出的位置,所以
banner Hello > bannerout
将导致banner标准输出中的所有数据重定向到shell打开的文件描述符,从而写入名为bannerout
的文件。
Pipes与>
的工作方式类似,因为它们有助于控制数据流向的流程。然而,管道无法写入文件,只能用于帮助数据流从一个点到另一个点。
例如,这里有流经几个变电站的水和废物清洁:
pump --from lake | treatment --cleanse-water | pump | reservoir | pump > glass
水从湖中流过,通过管道进入水处理厂,从工厂流回到泵中,将其移至水库,然后再将水泵入市政水管并通过水槽进入水库玻璃。
请注意,管道只是将所有输出连接在一起,最终最终会出现在您的玻璃杯中。
它与命令相同,并在Linux上的shell中处理它们。它也遵循了达到最终结果的路径。
现在有一件我在之前的陈述中尚未讨论的最后一件事,即<
输入字符。它的作用是从文件中读取并将其输出到程序上的stdin。
cat < bannerout
将简单地打印存储在bannerout中的内容。如果您有要处理的文件,但由于不想在链中运行额外的命令而不想添加cat <file>
,则可以使用此方法。
所以试试这个:
echo "Hello" > bannerinput
banner < bannerinput
首先将字符串“Hello”放在文件bannerinput
中,然后当您的运行横幅将从文件bannerinput
中读取时。
我希望这有助于您了解重定向和解压缩在Unix上是如何工作的(如果不是大多数也适用于Windows)。
答案 2 :(得分:4)
到目前为止,所有的答案都是在调用程序的东西(shell,无论如何)的上下文中。程序本身可以使stdout
除终端之外的其他东西。 C标准库提供freopen
,允许程序员在任何兼容环境中重定向stdout。 POSIX提供了许多其他机制(popen
,fdopen
,...),为程序员提供了更多控制。我怀疑Windows提供了类似的机制。
答案 3 :(得分:3)
三个标准文件描述符0,1和2可能发生任何数量的事情。任何人都可以使用附加到他们喜欢的任何文件描述符来启动新进程。
例如,GNU屏幕将输出放入管道并允许动态重新连接会话。 SSH获取输出并将其返回到另一端。当然,所有众多shell重定向器都经常使用操作文件描述符。
答案 4 :(得分:3)
对于拥有stdout
的程序,它必须在托管实施(带有操作系统的实施),或带有附加功能的独立实施上运行。
我很难在没有某种控制台的情况下实现这样的实现,但让我们假设Mars Rover有一个完整的操作系统并且用C(或C ++)编程并且没有那个控制台
/* 2001-07-15: JPL: stdout is the headquarters */
puts("Help. I'm stuck.");
可能已将消息发送给NASA总部。
答案 5 :(得分:2)
如果你运行这样的程序,Windows和Linux都会将stdout
重定向到一个文件:
my_program > some_file
这是最常见的情况,但许多其他类型的重定向都是可能的。在Linux上,您可以将stdout
重定向到支持“文件描述符”界面的任何内容,例如管道,套接字,文件和其他各种内容。
答案 6 :(得分:1)
一个人可能想要重定向stdout的情况的一个简单示例是将信息传递给另一个程序。 Unix / Linux命令ps
生成属于当前用户的进程列表。如果此列表很长并且您想要搜索特定进程,则可以输入
ps | grep thing
会将stdout
的{{1}}重定向到ps
的{{1}}。