C 使用fread和fwrite

C 使用fread和fwrite,c,fwrite,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; } #包括 int mai

我正在努力学习如何使用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;
}
#包括
int main()
{
文件*fp;
fp=fopen(“最大的.c”,“r+”);
int c=fwrite(fp,sizeof(fp),1,stdout);
printf(“如果写入成功,则输出为1:%d\n”,c);
返回0;
}
这不管用。在屏幕上显示一些乱码。为什么?

因为您从未从打开的文件中读取内容

相反,您将
文件
数据结构(标准库实现内部的内容)的内存中定义转储到
标准输出
,从而产生乱码输出

必须有一个字节缓冲区,首先从
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特有的功能,在这里您确实可以跳过在应用程序级别进行阅读。相反,这是在内核内部完成的,这可能会打开内核进行优化。不过,这可能比您当前的级别略高。

它应该是
c=fwrite(fp,sizeof(int),1,stdout)
,1如果你想写一个int。你想读还是写?请检查read Example*fp的大小是否等于
Get
或not?@earik87绝对不是,
sizeof*fp
只是标准库的
文件的结构实现的大小,并且不会告诉你正在执行的I/O的状态。