什么是"cerr"和"stderr"?

Rus*_*sel 31 c c++ error-handling stderr

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

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

另外,"屏幕"输出本身就是一个流吗?也许我不太了解溪流.我知道,这当然也可以保存到文件中.所有这些都会使用fprintf/ fscanf等吗?

pax*_*blo 42

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

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

cerr << "Urk!\n";
fprintf (stderr, "Urk!\n");
Run Code Online (Sandbox Code Playgroud)

我不确定你在这种情况下"恢复"是什么意思,输出转到标准错误就是这样.该程序并不意味着在此之后关心它.如果您的意思是如何保存以供日后使用,请参阅下一段.

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

run_my_prog 2>error.out
Run Code Online (Sandbox Code Playgroud)

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

run_my_prog >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

(/dev/tty尽管有直接写作等棘手的事情).该片段将重定向标准输出和标准错误以转到位桶.

  • 另一个区别是标准错误要么不缓冲(即每次写入时自动刷新),要么行缓冲(每个`\n`上自动刷新),无论它是否引用交互设备.相反,如果(并且仅当)它不引用交互式设备,则标准输出被完全缓冲. (4认同)
  • 好吧,从技术上讲,这是stdout和stderr(或cout和cerr)之间的区别,而不是cerr和stderr :-) (3认同)

dan*_*n04 7

它们之间有什么区别

stderr是一个FILE*标准C库的一部分. cerr是一个ostream标准C++库的一部分.

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

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