Я создал программу, которая использует кодирование Хаффмана для сжатия и распаковки файлов .txt (ANSI, Unicode, UTF-8, Big Endian Unicode …).
При распаковке я беру символы из двоичного дерева и помещаю их в .txt в двоичном режиме:
Ofstream F;
F.open("example.txt", ios::binary);
Я должен написать в файл .txt в двоичный режим потому что мне нужно распаковать каждый тип .txt файла (не только ANSI), поэтому мои символы — это отдельные байты.
В Windows он помещает все символы, но не заботится о символе Enter!
Например, если у меня есть этот файл example.txt:
Hello
World!
=)
Я сжимаю его в файл example.dat и сохраняю дерево Хаффмана в другой файл (exampletree.dat).
Теперь для распаковки example.dat я беру символы из дерева, сохраненного в exampletree.dat, и помещаю их в новый файл .txt через put()
или же fwrite()
, но на Windows это будет так:
HelloWorld!=)
В Ubuntu он работает отлично и сохраняет также символ Enter!
Это не ошибка кода, потому что если я распечатываю в консоли распакованный файл .txt, он также печатает введенные символы! Так что есть проблема в Windows! Может ли кто-нибудь помочь мне?
Вы пытались открыть файл с помощью WordPad или любого другого расширенного текстового редактора (Notepad ++), который идентифицирует LF как символ новой строки. Блокнот редактора по умолчанию поместит его в одну строку, как вы описали.
Возможно, это не то решение, которое вы ищете. Но проблема, по-видимому, связана с тем, что вместо строки по умолчанию CR / LF используется LF в качестве разрыва строки.
Похоже, что это будет разница в обработке EndOfLine в Linux против Windows. EOL может быть просто «\ n» или «\ r \ n», т. Е. Windows обычно ставит 0x0d, 0x0a в конце строк.
В Windows есть разница между:
fopen( "filename", "w" );
fopen( "filename", "tw" );
цитата:
В текстовом режиме комбинации возврата каретки и перевода строки преобразуются в однострочные при вводе, а символы перевода строки переводятся в комбинации возврата каретки и перевода строки при выводе.