2

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

这行不通。在屏幕上显示一些乱码。为什么?

4

1 回答 1

8

因为你从来没有从你打开的文件中读取

相反,您将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()调用,当然这仍然应该发生)。

然后它调用fwrite(),将包含从文件中读取的数据的缓冲区交给它。

请注意,这将读取(并因此写入)最多 4096 个字符;如果输入文件较大,您将看不到剩余数据。这可以通过在循环中执行上述操作来解决,当fread()返回 0 时停止。

顺便说一句,您的使用让我想起了 Linux 特定的sendfile()功能,您确实可以跳过在应用程序级别进行阅读。相反,这是在内核内部完成的,这可能为优化打开了大门。不过,这可能略高于您当前的水平。

于 2013-07-12T07:30:24.697 回答