Я создал программу, использующую кодирование Huffman для сжатия и распаковки файлов.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! Может кто-нибудь мне помочь?
Вы пытались открыть файл с помощью текстового редактора или любого другого расширенного текстового редактора (Notepad++), который идентифицирует LF как символ новой строки. Блокнот редактора по умолчанию помещает его в одну строку, как описано.
Это не может быть решением, которое вы ищете. Но проблема заключается в том, что LF используется как разрыв строки, а не по умолчанию CR/LF по умолчанию.
Похоже, что это будет разница в обработке EndOfLine на Linux и Windows. EOL может быть просто "\n" или "\ r\n" - то есть Windows обычно ставит 0x0d, 0x0a в конце строк. В Windows есть разница между:
fopen( "filename", "w" );
fopen( "filename", "tw" );
quote: В текстовом режиме комбинации возврата каретки возвращаются в отдельные строки на входе, а символы перевода строки переводятся в кавычки возвратно-линейных комбинаций на выходе