【发布时间】:2012-10-27 01:06:31
【问题描述】:
我知道这两个函数都可以用来输出到控制台。
我读了that question,但没有人不知道在输出到控制台时更喜欢使用哪个。
那么哪个功能更好,有什么大的区别吗?
【问题讨论】:
-
这取决于你。你是程序员。您设置首选项。
我知道这两个函数都可以用来输出到控制台。
我读了that question,但没有人不知道在输出到控制台时更喜欢使用哪个。
那么哪个功能更好,有什么大的区别吗?
【问题讨论】:
每个进程都有一个名为stdin 的输入流和两个输出流stdout 和stderr。这些输出流都连接到您的终端,因此以下命令都会将“hello”行打印到您的终端:
printf("hello\n");
fprintf(stdout, "hello\n");
fprintf(stderr, "hello\n");
前两个完全相同,第一个更短更方便。第一种是最常用的。
第三个不同之处在于发送到stderr 的内容与发送到stdout 的内容在逻辑上是分开的。它通常用于您希望用户看到的错误消息。库函数perror 将其错误消息打印到stderr。
stderr 流在逻辑上分离的意义在于它的内容可以与stdout 分离。例如,假设我们使用命令ls -l 列出一个文件。
$ touch myfile
$ ls -l myfile
-rw-r--r-- 1 wrm staff 0 6 Nov 20:44 myfile
现在,如果我们将ls 的输出重定向到另一个文件,我们会看到以下内容:
$ ls -l myfile > otherfile
$
没有输出输出,因为> 将ls 进程的stdout 流重定向到otherfile。您可以通过查看otherfile 看到它重定向的输出:
$ cat otherfile
-rw-r--r-- 1 wrm staff 0 6 Nov 20:44 myfile
$
但是> 没有重定向stderr 流。您可以通过删除myfile 并重新运行重定向的ls -l 命令来测试:
$ rm myfile
$ ls -l myfile > otherfile
ls: myfile: No such file or directory
$
所以在这里你可以看到虽然 stdout 被重定向到 otherfile ,stderr 没有被重定向,所以它的内容出现在终端上。还要注意otherfile 现在是空的,因为ls 命令没有找到myfile,所以没有任何东西可以发送到stdout。
也可以重定向stderr,但这取决于您的shell(控制您的终端的程序)如何完成。
【讨论】:
引用标准(n1570 中的 7.21.6.3):
printf函数等效于fprintf插入参数stdout在printf的参数之前。
所以printf打印到控制台时更方便,否则没有区别。但是fprintf如果要更改输出目标,修改起来会容易一些。
【讨论】:
如果您需要打印到特定的输出流,请使用 fprintf。
如果您需要显示错误消息,请使用 fprintf w/stderr
如果您正在开发命令行可执行文件并且只想向用户显示某些内容,请使用 printf。
【讨论】: