36

它们之间有什么区别以及它们是如何使用的?谁能指出我的例子?

具体来说,在这两种情况下,您如何“写入”流,以及如何恢复和输出(即到屏幕)已写入其中的文本?

另外,“屏幕”输出本身就是一个流,对吗?也许我对流的理解不够好。当然,这也可以保存到文件中,我知道。所有这些都会使用fprintf/fscanf等吗?

4

2 回答 2

51

cerr是 C++ 流,stderr是 C 文件句柄,都表示标准错误输出。

您以与写入其他流和文件句柄相同的方式写入它们:

cerr << "Urk!\n";
fprintf (stderr, "Urk!\n");

我不确定在这种情况下您所说的“恢复”是什么意思,输出进入标准错误,仅此而已。在那之后,该程序并不打算关心它。如果您的意思是如何从程序外部保存它以备后用,请参阅下一段。

默认情况下,它们会转到您的终端,但输出可以重定向到其他地方,例如:

run_my_prog 2>error.out

而且,是的,“屏幕”输出是一个流(或文件句柄),但这通常只是因为默认情况下连接到您的“屏幕” stdout/coutstderr/cerr重定向会影响这一点,如下面的情况,不会将任何内容写入您的屏幕:

run_my_prog >/dev/null 2>&1

/dev/tty(尽管有一些棘手的事情,比如直接写信)。该片段会将标准输出和标准错误重定向到位桶。

于 2010-07-08T01:37:12.043 回答
11

它们之间有什么区别

stderr是一个FILE*,并且是标准 C 库的一部分。 cerrostream标准 C++ 库的一部分。

另外,“屏幕”输出本身就是一个流,对吗?

是的。但实际上有两个流默认写入屏幕:stdout/cout用于正常输出,stderr/cerr用于错误消息。这对于重定向很有用:您可以重定向stdout到文件,但屏幕上仍然显示错误消息。

于 2010-07-08T01:39:26.593 回答