int32_t a[MAX];
int main()
{
FILE *f = fopen("New.doc","rb");
FILE *g = fopen("temp.doc","wb");
if (f == NULL || g == NULL)
return 0;
int n;
while ((n = fread(a, 4, MAX, f)) > 0)
fwrite(a, 1, n, g);
fclose(f);
fclose(g);
return 0;
}
磁盘上的大小" new.doc"在我的电脑中是20kb,当我运行上面的代码时,我得到了#temp; temp.doc"大小为5kb =>数据丢失。但是,当我将4改为1时,我得到了#temp; temp.doc"这与" new.doc"完全相似。谁能解释发生了什么?谢谢。
答案 0 :(得分:1)
fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
成功时, fread()和 fwrite()会返回读取的项目数或 书面。 此数字等于仅在传输时 字节 的数量 尺寸 1 。
在你的情况下
n = fread(a, 4, MAX, f)
会返回sizeof file/4
。当你再次写时,你实际上写了文件的1/4
。您可以将fread
来电修改为1
而不是4
答案 1 :(得分:1)
这种情况正在发生,因为您没有注意fread()
和fwrite()
的语义。一个返回写入的项目数,另一个需要写入的字节数。在您的情况下,您正在读取4字节元素并写入1字节元素,因此您当然缺少75%的文件。在fread()
和fwrite()
的调用中使用匹配的元素大小,一切都会很好。
请注意,如果您的文件实际上不包含4字节元素(例如,它们是文本文件),则最好使用1的元素大小(我建议将a
更改为{{1}类型减少混淆,并在函数调用中使用char
作为元素大小。)