繁体   English   中英

哪个更好 - printf或fprintf

[英]Which is preferable - printf or fprintf

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

引用标准(n1570中的7.21.6.3):

printf函数等效于fprintf ,其参数stdout插入到printf的参数之前。

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

每个进程都有一个名为stdin的输入流和两个输出流stdoutstderr 这些输出流都连接到您的终端,因此以下命令将打印“hello”行到您的终端:

printf("hello\n");
fprintf(stdout, "hello\n");

fprintf(stderr, "hello\n");

前两个完全相同,第一个只是更短更方便。 第一种是最常用的。

第三个不同之处在于发送到stderr的内容在逻辑上与发送到stdout的内容是分开的。 它通常用于您希望用户看到的错误消息。 库函数perror其错误消息stderrstderr

逻辑上分离的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(控制终端的程序)如何完成。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM