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()
语句并生成了
相同的结果(使用 cmp
和 diff
进行比较)。我知道 fwrite
和 fprint
之间的区别,但是作者在这种情况下选择使用 fwrite()
而不是 fprintf
或 printf
有什么具体原因吗?
but was there any specific reason the author chose to use fwrite() over fprintf or printf in this context ?
研究fwrite
和fprintf
在GNU libc中的实现。
您会发现 fprintf
比 fwrite
更复杂、更脆弱、更慢。它也更难理解。
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()
在这种病态情况下提供正确的功能。
我正在阅读 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()
语句并生成了
相同的结果(使用 cmp
和 diff
进行比较)。我知道 fwrite
和 fprint
之间的区别,但是作者在这种情况下选择使用 fwrite()
而不是 fprintf
或 printf
有什么具体原因吗?
but was there any specific reason the author chose to use fwrite() over fprintf or printf in this context ?
研究fwrite
和fprintf
在GNU libc中的实现。
您会发现 fprintf
比 fwrite
更复杂、更脆弱、更慢。它也更难理解。
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()
在这种病态情况下提供正确的功能。