8

我知道这两个函数都可以用来输出到控制台。
我读了那个问题,但没有人不知道在输出到控制台时更喜欢使用哪个。那么哪个功能更好,有什么大的区别吗?

4

3 回答 3

14

引用标准(n1570 中的 7.21.6.3):

printf函数等效于fprintf在 的参数stdout之前插入参数printf

所以printf打印到控制台时更方便,否则没有区别。但是fprintf如果要更改输出目标,则更容易修改。

于 2012-11-07T01:13:17.233 回答
8

每个进程都有一个输入流、命名流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
$ 

没有打印输出,因为将流程的流>重定向到. 您可以通过查看以下内容来查看它重定向的输出:stdoutlsotherfileotherfile

$ 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被重定向到otherfilestderr但没有被重定向,所以它的内容出现在终端上。另请注意,otherfile现在是空的,因为ls命令没有找到myfile,所以没有什么可以发送到stdout.

也可以重定向stderr,但这取决于您的 shell(控制终端的程序)如何完成。

于 2012-11-07T01:57:38.090 回答
2

如果您需要打印到特定的输出流,请使用 fprintf。

如果您需要显示错误消息,请使用 fprintf w/stderr

如果您正在开发命令行可执行文件并且只想向用户显示某些内容,请使用 printf。

于 2012-11-07T01:13:16.623 回答