gpt4 book ai didi

c - 使用 fread 和 fwrite

转载 作者:太空宇宙 更新时间:2023-11-04 00:38:47 24 4
gpt4 key购买 nike

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

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

最佳答案

因为您永远不会阅读您打开的文件。

相反,您将 FILE 数据结构(标准库实现内部的东西)的内存定义转储到 stdout,从而产生乱码输出。

你必须有一个字节缓冲区,你首先从 fp 读取数据,然后将新读取的数据写入 stdout:

FILE *fp;
char buffer[4096];

/* ... */
const size_t got = fread(buffer, 1, sizeof buffer, fp);
fwrite(buffer, 1, got, stdout);

上面添加了一个字符的缓冲区,并调用了一个fread() 尝试用fp 中的数据填充该缓冲区> 文件(我没有重复 fopen() 调用,这当然应该仍然发生)。

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

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

顺便说一下,你的用法让我想起了 Linux 特有的 sendfile()功能,你真的可以跳过在应用程序级别进行阅读。相反,这是在内核内部完成的,这可能会打开它进行优化。不过,这可能略高于您当前的水平。

关于c - 使用 fread 和 fwrite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17609702/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com