复制二进制文件的内容

时间:2010-05-03 12:00:21

标签: c filehandle copying

我正在设计一个图像解码器,作为第一步,我试图复制使用c。即打开文件,并将其内容写入新文件。以下是我使用的代码。

while((c=getc(fp))!=EOF)
  fprintf(fp1,"%c",c);

其中fp是源文件,fp1是目标文件。 程序执行时没有任何错误,但图像文件(“.bmp”)未正确复制。我观察到复制文件的大小较小,只有20%的图像可见,其他都是黑色。当我尝试使用简单的文本文件时,副本就完成了。

你知道问题是什么吗?

4 个答案:

答案 0 :(得分:9)

确保变量c的类型为int char。换句话说,发布更多代码。

这是因为EOF常量的值通常为-1,如果您将字符读为char - 大小的值,则0xff的每个字节都将显示为EOF不变。使用int的额外位;有两个分开的空间。

答案 1 :(得分:1)

您是否以二进制模式打开文件?你传给fopen的是什么?

答案 2 :(得分:0)

这是最受欢迎的C gotchas之一。

答案 3 :(得分:0)

您应该一次使用freadfwrite

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 \ n上转换为\ r \ n (旧)MACs)