2013-04-01 5 views
0

Для задания домашней работы я создал простую программу сжатия/декомпрессии, которая использует наивную реализацию кодирования во время выполнения. Я заработал свою программу; сжатие и распаковка любого текстового файла с большим количеством символов (например, источника программы) работает безупречно. В качестве эксперимента я попытался сжать/распаковать двоичный файл самой программы сжатия. Это привело к тому, что файл был намного меньше исходного двоичного файла и, очевидно, не работает. Что вызывает потерю данных?Представление двоичного файла C

Мое предположение заключалось в том, что это связано с тем, как представлены двоичные файлы, но я не могу много узнать об этом.

+2

вы открываете файл в бинарный режим? – NPE

+0

Двоичные файлы - это всего лишь неформатированный поток 1 и 0 –

+0

@NPE Нет, моя программа просто считывает входные данные с помощью 'getchar()'. Разве это не просто захват битов из файла 8 в момент времени и возврат их целочисленного значения? – grimetime

ответ

3

Возможные проблемы:

  • Ваша программа открывает двоичный файл в текстовом режиме, который повреждает '\r' и '\n' байтов
  • Ваша программа неправильно обрабатывает нулевые байты, рассматривая их как концы строк ('\0') а не как собственные данные
  • Ваша программа использует char (это фактически signed char) для байтов данных и корректно работает только с неотрицательными значениями, которые являются символами ASCII английского текста, но не работает wi й произвольных значений символа/байт, которые могут быть отрицательными
  • Вашей программы переполнения где которая проявляется только на больших файлах
  • Вашей программа имеет некоторые другие данные в зависимости от ошибка
+0

В Linux двоичный и текстовый режимы одинаковы .... –

+0

@BasileStarynkevitch Это не установлено в камне. Нам не сказали, какой компилятор используется. –

+0

Обработка текстового режима и двоичного режима не зависит от компилятора. Это делается стандартными библиотеками ('libc' или' libstdC++ '); и в Linux все они обрабатывают двоичный текст и текст аналогично w.r.t. EOL. –

1

Если платформа является linux (по мере того как вопрос отмечен), нет никакой разницы между двоичным и текстовым режимами. Так не должно быть; но даже в этом случае файлы должны быть открыты как двоичные.

Я подозреваю, что ваша проблема заключается в том, что программа обрабатывает символы «\ 0» в качестве терминаторов (или иначе специально) вместо действительных данных.