2014-02-15 1 views
0

Я создал программу, использующую кодирование Хаффмана для сжатия и распаковки .txt-файлов (ANSI, Unicode, UTF-8, Big Endian Unicode ...).C++ в Windows Я не могу поместить символ Enter в файл .txt

В декомпрессии я беру персонаж из бинарного дерева, и я положил их в .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, и я положил их в новый текстовый файл через put() или fwrite(), но на Windows, она будет выглядеть следующим образом:

HelloWorld!=) 

На Ubuntu он отлично работает и сохраняет также символ Enter!

Это не ошибка кода, потому что если я печатаю на консоли распакованный файл .txt, он также печатает символы ввода! Так что проблема в Windows! Не мог бы кто-нибудь мне помочь?

+0

Что вы используете для отображения содержимого файла? Для меня это не похоже на проблему ОС, а проблема с текстовым редактором. Вы использовали Notepad ++ для отображения содержимого файла в окнах? – ThunderGr

+0

Большое вам спасибо! – Maghio

ответ

0

Вы пытались открыть файл с помощью текстового редактора или любого другого расширенного текстового редактора (Notepad ++), который идентифицирует LF как символ новой строки. Блокнот редактора по умолчанию помещает его в одну строку, как описано.

Это не может быть решение, которое вы ищете. Но проблема заключается в том, что LF используется как разрыв строки, а не по умолчанию CR/LF по умолчанию.

+0

Да, это единственное решение. Бог благословит вас. – Maghio

+0

Спасибо.Приятно было знать, что это сработало. – Gouri

0

Похоже, что это будет разница в обработке EndOfLine в Linux и Windows. EOL может быть просто «\ n» или «\ r \ n» - то есть Windows обычно ставит 0x0d, 0x0a в конце строк. В Windows есть разница между:

fopen("filename", "w"); 

fopen("filename", "tw"); 

цитата: В текстовом режиме, каретка комбинация возвратного перевода строки переводятся в отдельные пробельные символы на входе, и символы перевода строк переведены на возврат каретки-переводе строки комбинаций на выходе

+0

Мне нужно записать в .txt-файл в ** двоичном режиме **, потому что мне нужно распаковать каждый тип .txt-файла (не только ANSI), так что мои символы - это одиночные байты. – Maghio

+0

Да, но когда вы читаете текстовый файл, вы получаете исходные комбинации возвращаемых строк, преобразованные в SINGLE LINEFEEDS. Поскольку вы пишете двоичный файл, вы никогда не получите окна для обратного перевода. Вам придется сделать это самостоятельно - или прочитать текстовый файл в режиме BINARY. – TonyWilk