复制二进制文件的内容
我正在设计一个图像解码器,作为第一步,我试图复制使用cie打开文件,并将其内容写入新文件。 下面是我使用的代码。
while((c=getc(fp))!=EOF) fprintf(fp1,"%c",c);
其中fp是源文件,fp1是目标文件。 程序执行时没有任何错误,但图像文件(“.bmp”)未正确复制。 我观察到复制文件的大小较小,只有20%的图像可见,其他都是黑色。 当我尝试使用简单的文本文件时,副本已完成。
你知道问题是什么吗?
确保变量c
的类型是int
, 而不是 char
。 换句话说,发布更多代码。
这是因为EOF
常量的值通常为-1,如果您将字符读取为char
-sized值,则每个0xff
字节将看作EOF常量。 使用int
的额外位; 有两个分开的空间。
你是否以二进制模式打开文件? 你传给fopen
什么?
它是最“流行”的C陷阱之一 。
你应该一次使用一个块来使用fread
和fwrite
FILE *fd1 = fopen("source.bmp", "r"); FILE *fd2 = fopen("destination.bmp", "w"); if(!fd1 || !fd2) // handle open error size_t l1; unsigned char buffer[8192]; //Data to be read while((l1 = fread(buffer, 1, sizeof buffer, fd1)) > 0) { size_t l2 = fwrite(buffer, 1, l1, fd2); if(l2 < l1) { if(ferror(fd2)) // handle error else // Handle media full } } fclose(fd1); fclose(fd2);
在更大的块中读取速度要快得多,而fread / fwrite只处理二进制数据,所以\ n没有问题可能会在输出中转换为\ r \ n(在Windows和DOS上)或\ r \ n(在(旧)上MACS)