我正在设计一个图像解码器,并作为第一步,我试图复制使用c。即打开文件,并将其内容写入新文件。以下是我使用的代码。复制二进制文件的内容
while((c=getc(fp))!=EOF)
fprintf(fp1,"%c",c);
其中fp是源文件,fp1是目标文件。 程序执行时没有任何错误,但图像文件(“.bmp”)未正确复制。我观察到复制文件的大小较小,只有20%的图像可见,其他都是黑色的。当我尝试使用简单的文本文件时,副本已完成。
你知道问题出在哪里吗?
我正在设计一个图像解码器,并作为第一步,我试图复制使用c。即打开文件,并将其内容写入新文件。以下是我使用的代码。复制二进制文件的内容
while((c=getc(fp))!=EOF)
fprintf(fp1,"%c",c);
其中fp是源文件,fp1是目标文件。 程序执行时没有任何错误,但图像文件(“.bmp”)未正确复制。我观察到复制文件的大小较小,只有20%的图像可见,其他都是黑色的。当我尝试使用简单的文本文件时,副本已完成。
你知道问题出在哪里吗?
确保变量c
的类型是int
,不char
。换句话说,发布更多的代码。
这是因为EOF
常数的值通常为-1,如果你读字符char
尺度的值,每一个是0xff
将如下的EOF常数字节。用int
的额外位;有两个空间可以分开。
是的,这是错误,首先我试图直接使用getc()而不将它存储在变量中。然后突然我宣布了一个字符并使用它。谢谢。 – Gan 2010-05-03 12:15:26
真棒抓住,放松。 – 2010-05-03 12:23:33
你应该使用块一次使用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问题可能得到(在Windows和DOS上)或\ r(在(旧)MAC上)转换为\ r \ n
一个非常好的建议,我也会在我的程序中使用它,看看它是如何工作的。谢谢。 – Gan 2010-05-06 09:45:55
标题应该更好:“复制二进制文件的内容”,这不是特定于图像。重新标记。 – leonbloy 2010-05-03 13:51:45