使用fread和fwrite

时间:2013-07-12 07:28:15

标签: c fwrite

我正在尝试学习如何使用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;
}

这不起作用。在屏幕上显示一些乱码。为什么呢?

1 个答案:

答案 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()函数,你真的可以跳过在应用程序级别阅读。相反,这是在内核中完成的,可能会打开它进行优化。不过,这可能略高于你目前的水平。