2

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

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

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

你知道问题是什么吗?

4

4 回答 4

9

确保变量的类型cint而不是 char。换句话说,发布更多代码。

这是因为EOF常量的值通常为 -1,如果您将字符读取为char-size 值,则每个字节都0xff将看起来像 EOF 常量。加上额外的int; 有空间将两者分开。

于 2010-05-03T12:02:33.987 回答
1

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

于 2010-05-03T12:02:47.387 回答
0

它是最“流行”的C 陷阱之一。

于 2010-05-03T13:53:50.407 回答
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 没有问题,它可能会在输出中转换为 \r\n (在 Windows 和 DOS 上)或 \r (在(旧) MAC)

于 2010-05-03T18:52:41.413 回答