копирование содержимого двоичного файла - PullRequest
2 голосов
/ 03 мая 2010

Я проектирую декодер изображений и в качестве первого шага я попытался просто скопировать с помощью c. Т.е. откройте файл и запишите его содержимое в новый файл. Ниже приведен код, который я использовал.

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

где fp - исходный файл, а fp1 - конечный файл. Программа выполняется без ошибок, но файл образа (". Bmp") не копируется должным образом. Я заметил, что размер скопированного файла меньше, и только 20% изображения видно, все остальное черное. Когда я попытался с простыми текстовыми файлами, копия была завершена.

Знаете ли вы, в чем проблема?

Ответы [ 4 ]

9 голосов
/ 03 мая 2010

Убедитесь, что тип переменной c равен int, , а не char. Другими словами, отправьте больше кода.

Это потому, что значение константы EOF обычно равно -1, и если вы читаете символы как значения char, каждый байт, равный 0xff, будет выглядеть как константа EOF. С дополнительными битами int; есть место для их разделения.

1 голос
/ 03 мая 2010

Открывали ли вы файлы в двоичном режиме? Что вы переходите на fopen?

0 голосов
/ 03 мая 2010

Вы должны использовать 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 (в (старые) MAC)

0 голосов
/ 03 мая 2010

Это один из самых "популярных" C получил .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...