2010-05-03 3 views
2

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

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

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

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

+0

Название должно быть лучше: «Копирование содержимого двоичного файла», это не относится к изображениям. Retagged. – leonbloy

ответ

9

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

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

+0

Возможно, это была ошибка, сначала я попытался напрямую использовать getc(), не сохраняя ее в переменной. то вдруг я объявил символ и использовал его. Благодарю. – Gan

+0

Удивительный улов, расслабиться. –

1

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

+0

Я использовал r-режим, это сработало, и я также попробовал «rb». ошибка заключалась в том, что я объявила переменную как char. Благодарю. – Gan

0

Это один из самых «популярных» C gotchas.

+0

Это объяснение хорошее. Благодарю. – Gan

0

Вы должны использовать 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 обрабатывать только двоичные данные, так что никаких проблем с \ п, которые могли бы получить преобразуется в \ r \ n на выходе (в Windows и DOS) или \ r (на (старых) MAC-адресах)

+0

Очень хорошее предложение, я также буду использовать его в своей программе и посмотреть, как это работает. Благодарю. – Gan

Смежные вопросы