【问题标题】:Which is preferable - printf or fprintf哪个更可取 - printf 或 fprintf
【发布时间】:2012-10-27 01:06:31
【问题描述】:

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

【问题讨论】:

  • 这取决于你。你是程序员。您设置首选项。

标签: c printf output


【解决方案1】:

每个进程都有一个名为stdin 的输入流和两个输出流stdoutstderr。这些输出流都连接到您的终端,因此以下命令都会将“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 被重定向到 otherfilestderr 没有被重定向,所以它的内容出现在终端上。还要注意otherfile 现在是空的,因为ls 命令没有找到myfile,所以没有任何东西可以发送到stdout

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

【讨论】:

    【解决方案2】:

    引用标准(n1570 中的 7.21.6.3):

    printf 函数等效于 fprintf 插入参数 stdoutprintf 的参数之前。

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

    【讨论】:

    • 不幸的是,情况并非总是如此,ARM v7 LEDE 工具链将绕过 printf,而 fprintf(stdout, ...) 将正常工作。
    • 这意味着它不是一个符合标准的实现,不是吗?
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 2011-06-05
      • 2012-06-12
      • 2013-11-28
      • 1970-01-01
      • 2010-10-01
      相关资源
      最近更新 更多