C:fwrite() 与 (f)printf?

C: fwrite() vs (f)printf?

我正在阅读 getline 函数的手册页并看到了它的演示:

 #define _GNU_SOURCE
       #include <stdio.h>
       #include <stdlib.h>

       int
       main(int argc, char *argv[])
       {
           FILE *stream;
           char *line = NULL;
           size_t len = 0;
           ssize_t nread;

        ...
           while ((nread = getline(&line, &len, stream)) != -1) {
               printf("Retrieved line of length %zu:\n", nread);
               fwrite(line, nread, 1, stdout); /* ? */
           }

           free(line);
           fclose(stream);
           exit(EXIT_SUCCESS);
       }

我用 printf ("%s", line) 替换了 fwrite() 语句并生成了 相同的结果(使用 cmpdiff 进行比较)。我知道 fwritefprint 之间的区别,但是作者在这种情况下选择使用 fwrite() 而不是 fprintfprintf 有什么具体原因吗?

but was there any specific reason the author chose to use fwrite() over fprintf or printf in this context ?

研究fwritefprintfGNU libc中的实现。

您会发现 fprintffwrite 更复杂、更脆弱、更慢。它也更难理解。

AFAIK,一些编译器(包括有时 GCC) are able to optimize(在简单情况下)一些调用fprintf变成类似于你的 fwrite 的东西。你可以尝试将你的 foo.c 源代码编译为 gcc -Wall -O3 -fverbose-asm -S foo.c 并查看生成的汇编代码 foo.s

fwrite(line, nread, 1, stdout)printf ("%s", line) 之间的差异包括:

printf ("%s", line) 写入第一个空字符。

fwrite(line, nread, 1, stdout) 写入输入长度。

这在读取 空字符 时有所不同,因此使用 fwrite() 在这种病态情况下提供正确的功能。