我正在尝试学习如何使用fread和fwrite。 在这里,我试图在标准输出上打印文件的内容。
#include <stdio.h>
int main()
{
FILE *fp;
fp = fopen("largest.c", "r+");
int c = fwrite(fp, sizeof(fp), 1, stdout);
printf("Output is 1 if write succesful! : %d\n", c);
return 0;
}
这不起作用。在屏幕上显示一些乱码。为什么呢?
答案 0 :(得分:7)
因为您永远不会从您打开的文件中阅读。
相反,您正在将FILE
数据结构的内存中定义(标准库实现内部的内容)转储到stdout
,从而产生乱码输出。
您必须有一个字节缓冲区,首先从fp
读取,然后将新读取的数据写入stdout
:
FILE *fp;
char buffer[4096];
/* ... */
const size_t got = fread(buffer, 1, sizeof buffer, fp);
fwrite(buffer, 1, got, stdout);
上面添加了buffer
个字符,并进行了一次fread()
调用,尝试使用fp
文件中的数据填充该缓冲区(我没有重复fopen()
1}}调用,当然应该发生。)
然后调用fwrite()
,将包含从文件中读取的数据的缓冲区交给它。
请注意,这将读取(并因此写入)最多4096个字符;如果输入文件较大,您将看不到剩余的数据。这可以通过在循环中执行上述操作来修复,在fread()
返回0时停止。
顺便说一下,你的用法让我想起了Linux特有的sendfile()
函数,你真的可以跳过在应用程序级别阅读。相反,这是在内核中完成的,可能会打开它进行优化。不过,这可能略高于你目前的水平。