因为你从来没有从你打开的文件中读取。
相反,您将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()
功能,您确实可以跳过在应用程序级别进行阅读。相反,这是在内核内部完成的,这可能为优化打开了大门。不过,这可能略高于您当前的水平。