LINUX.ORG.RU

В чём особенность использования \r\n и как сделать переход на новую строку в string?


0

1

Я так понял что для перехода на новую строку в DOS/Windows используется \r\n, а в Linux \n. У меня в string записывается, считываемая строка из XML содержащая в конце \r\n. Но переход на новую строку не осуществляется при дальнейшем использовании. Что можно сделать? как правильно обработать \r\n чтобы потом при использовании работал переход на новую строку. Может парсить «\r\n» ?


> Но переход на новую строку не осуществляется при дальнейшем использовании.

Расшифруйте. И не забудьте указать под какой ОС вы работаете.

anonymous
()
Ответ на: комментарий от anonymous

Расшифруйте мне тогда, пожалуйста, что именно хочет автор, и где именно у него «не осуществляется переход на следующую строку»?

mono ★★★★★
()
Ответ на: комментарий от mono
std::string str2(xml.GetData());
 if (str2.find ("\r\n") != std::string::npos)
   Console::WriteLine("Enter!\n");

xml.GetData() возвращает std::string

если я просто напишу

std::string str2("Hello\r\n");
 if (str2.find ("\r\n") != std::string::npos)
   Console::WriteLine("Enter!\n");
выполнится условие и выведется Console::WriteLine(«Enter!\n»); а в первом случае нет

g-71
() автор топика
Ответ на: комментарий от mono

грубо говоря, у меня не получается обработать символы преобразования когда они содержаться в обычном string

g-71
() автор топика
Ответ на: комментарий от g-71

OS, я так понимаю, Windows? А какие символы стоят в конце строки, которую возвращает xml.GetData()? только «\n»?

mono ★★★★★
()
Ответ на: комментарий от g-71

Обычная практика в языке Си такая: перевод строки всегда '\n', а функции, работающие с текстовым вводом-выводом, должны сами конвертировать его в правильное представление.

anonymous
()
Ответ на: комментарий от mono

да, windows. В конце строки стоит например \r\n и мне нужно чтобы нормально обрабатывался переход на след. строку, а не тупо выводилось \r\n вместе с текстом

g-71
() автор топика
Ответ на: комментарий от mono

Да std::endl тоже осуществляет перевод строки. А проблема в том, что вы советуете заменить '\n' на std::endl или проще говоря замени '\n' на '\n' в завуалированной форме.

anonymous
()

> У меня в string записывается, считываемая строка из XML содержащая в конце \r\n. Но переход на новую строку не осуществляется при дальнейшем использовании.

Как XML читаешь? Дело в том, что парсер может убрать \r, \n и другие whitespace символы из начала/конца строки.

nozh
()
Ответ на: комментарий от g-71

Судя по всему, \r\n экранируются парсером. Порробуй заменить «\\r\\n» в строке на «\r\n».

mono ★★★★★
()
Ответ на: комментарий от nozh

XML читаю с помощью CMarkup: fast simple C++ XML parser поидее может убрать, но он их выводит в консоль, т.е. видимо как-то отключает... Я пробовал \r\n вставить в середину строки - тоже выводит

 <pair>
  <key>ID_Down</key>
  <value>Down push\r\nExample</value>
 </pair>
g-71
() автор топика
Ответ на: комментарий от nozh

> Как XML читаешь? Дело в том, что парсер может убрать \r, \n

Как же достала уже эта школота на лоре: любой нормальный парсер все переводы строки приводит к '\n' и это описано в рекомендации XML (http://www.w3.org/TR/REC-xml/#sec-line-ends).

anonymous
()
Ответ на: комментарий от g-71

> «Down push\r\nExample»

Ну ты и отжигать ))))

Такое только в Си-строке прокатывает, в XML так символы '\r' и '\n' задавать нельзя.

anonymous
()
Ответ на: комментарий от anonymous

я понял в чём ошибка нужно так писать str2.find («\\r\\n») «в XML так символы '\r' и '\n' задавать нельзя» у меня задание такое, я не задавал, моя задача обработать

g-71
() автор топика
Ответ на: комментарий от g-71

>я понял в чём ошибка нужно так писать

Ты неправильно понял. Тебе на финфак писать нужно, а не сюда.

Led ★★★☆☆
()
Ответ на: комментарий от anonymous

>А что виндузятник делает на лоре???

Ты как с модераторами разговариваешь?!

Led ★★★☆☆
()
Ответ на: комментарий от anonymous

проблема в том, что вы советуете заменить '\n' на std::endl или проще говоря замени '\n' на '\n' в завуалированной форме

чушь. std::endl не обязан отправлять в поток ни LF, ни CR, ни вообще какой-либо фиксированный набор символов - на каждой конкретной платформе он реализует перевод строки соответственным для этой платформы образом

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

Да будет тебе известно, что текстовые потоки ввода-вывода на каждой конкретной платформе реализуют '\n' (перевод строки) соответственным для этой платформы образом.

anonymous
()
Ответ на: комментарий от anonymous

текстовые потоки ввода-вывода на каждой конкретной платформе реализуют '\n' (перевод строки) соответственным для этой платформы образом

пруфлинк?

jtootf ★★★★★
()

переход на след. строку осужествляется посредством добавления в конец строковой константы управляющей последовательности \n

std::cout<<"text_text_text\n";

управляющая последовательность \r - это код нажатия Enter. его используют при считывании.

do 
  std::cin>>ch;
while (ch != '\r');

sudo-s
()
Ответ на: комментарий от anonymous

С чего это вдруг не нужно стало?

в стандарт заглянул

jtootf ★★★★★
()
Ответ на: комментарий от sudo-s

> управляющая последовательность \r - это код нажатия Enter. его используют при считывании.

Боюсь тебя огорчить, но твой пример показывает, что в лучшем случае ты банальный неосилятор, в худшем банальный говнокодер. Твой цикл ввода бесконечный.

anonymous
()
Ответ на: комментарий от sudo-s

Работающий пример может быть таким: do std::cin >> noskipws >> ch; while (ch != '\n');

anonymous
()
Ответ на: комментарий от anonymous

ТЫ НИПАВЕРИШ!!! Оно кагбэ так и планировалось. А вообще это пример из книги Лафоре - Объектно-ориентированное программирование в С++. Хотя чего перед вами, анонимами распинаться...

sudo-s
()
Ответ на: комментарий от anonymous

Ты идиот, если до сих пор не понял, что это не мой пример

sudo-s
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.