Несоответствие между персонажами положить и прочитать - PullRequest
2 голосов
/ 08 января 2012

Я пытаюсь написать кодировщик Хаффмана, но получаю некоторые ошибки сжатия. Я идентифицировал проблему как несоответствие между символами, которые были помещены () в ofstream, и символами, читаемыми () из того же файла.

Один конкретный случай этой проблемы:

  • Метод put () записывает символ ASCII 10 (перевод строки)
  • read () читает символ 13 ASCII (возврат каретки)

Я думал читать и помещать чтение и запись необработанных данных (без перевода символов) Я не уверен, почему это происходит Кто-нибудь может мне помочь?

Вот экземпляр ofstream для записи сжатого файла:

std::ofstream compressedFileStream(getCompressedFileName(),std::ios::binary||std::ios::ate);

и экземпляр ifstream для чтения того же

    std::ifstream fileInput(getFileName()+".huf",std::ios::binary);

Код работает в Windows 7, и все потоки в программе открываются в двоичном режиме.

Ответы [ 3 ]

5 голосов
/ 08 января 2012

Не открывается в двоичном режиме из-за опечатки:

std::ofstream compressedFileStream(getCompressedFileName(),std::ios::binary||std::ios::ate)

должно быть:

std::ofstream compressedFileStream(getCompressedFileName(),std::ios::binary|std::ios::ate)
                                                                      //   ^

|, а не ||.

3 голосов
/ 08 января 2012

Симптомы показывают, что вы создаете ofsteam в текстовом режиме или создаете его с помощью filedesc, который открывается в текстовом режиме.Возможно, вы захотите передать ему ios :: binary во время сборки или он может работать в текстовом режиме в Windows.

После добавления кода причина оказывается опечаткой;

std::ios::binary||std::ios::ate

должно быть

std::ios::binary|std::ios::ate
0 голосов
/ 08 января 2012

В Windows, если вы пишете двоичные данные, вам нужно открыть файл с соответствующими атрибутами.

Аналогично, если вы читаете двоичные данные, вам нужно открыть файл с соответствующими атрибутами.

...