10

从 printf 打印自定义错误消息时为什么要使用 stderr 可以正常工作?

例如,当我可以写这样的语句时,为什么还要使用 stderr:

    printf("错误!你没有……等等等等");
4

5 回答 5

17

stderr代表标准错误流。

在控制台编程中,它就是控制台——屏幕。它本质上与stdout.

一般的做法是将所有错误消息stderr和所有常规输出重定向到stdout.

原因是可以将标准输出重定向到文件而不是屏幕。因此,如果您dir > dirlist.txt在命令提示符下执行命令,目录列表将进入文本文件而不是屏幕。如果您编写代码将错误消息重定向到stderr,则错误将始终显示在屏幕上而不是文件上,以便用户可以立即收到警告,而不是最终在文件中看到意外结果。

usingprintf()将向控制台显示错误消息,该消息将存储在stdout缓冲区中,但 usingstderr则不同

stderr可以用作任何接受 FILE* 类型参数并期望输出流的函数的参数,例如fputsor fprintf

尽管在许多情况下两者stdoutstderr都与相同的输出设备(如控制台)相关联,但应用程序可能会区分发送到 stdout 的内容和发送到 stderr 的内容,以防其中一个被重定向。例如,经常将控制台程序 ( stdout) 的常规输出重定向到文件,同时期望错误消息继续出现在控制台中。

freopen也可以使用该函数从程序中将 stderr 重定向到其他目的地。

stderris 永远不会在启动时完全缓冲。默认情况下,流是行缓冲还是不缓冲取决于库(参见 setvbuf)。

于 2013-11-08T23:38:52.390 回答
17

将所有错误消息重定向到 是一种很好的做法stderr,同时将常规输出定向到stdout. 这样做是有益的,因为写入的任何内容stderr都不会被缓冲,即,它会立即写入屏幕,以便可以立即警告用户。

于 2013-11-08T23:27:38.830 回答
9

这是一个很好的做法。

假设您使用linux。如果是这样,您可以按照以下方式运行程序:

./program >out 2>错误

'out' 文件将仅包含 STDOUT。
“错误”文件将仅包含 STDERR

因此,如果您的输出有数百行长,则在“错误”中查找少量错误比查看大量非错误行和错误行更容易。

于 2013-11-08T23:32:51.830 回答
1

如果您将程序的输出重定向到文件中,您仍然希望在屏幕上看到错误。

于 2013-11-08T23:32:12.147 回答
1

除了stderr不被缓冲之外,将输出拆分为错误与正常输出也很好,以允许其他程序更轻松地使用您的程序。这样,调用程序可以根据需要知道的内容有选择地重定向标准或错误输出。可以通过 Unix shell 手动使用相同的工具 - 这是我有时使用的一种方式:

% find / -iname hello.txt
find: /.DocumentRevisions-V100: Permission denied
find: /.fseventsd: Permission denied
find: /.MobileBackups: Permission denied
find: /.Spotlight-V100: Permission denied
find: /.Trashes: Permission denied
^C
% find / -iname hello.txt 2>/dev/null <-- filter "Permission denied" errors
于 2013-11-08T23:33:23.087 回答