CRLF конец строки и ostringstream

Я пытаюсь использовать ostringstream для создания строки, которая использует стандартные окончания строк платформы (поэтому для меня это CRLF, так как я разрабатываю для Windows). Я попробовал следующий код:

std::ostringstream out;
out << "line1\nline2\n";
const char* result = out.str().c_str(); // In result end of lines are '\n' instead
                                        // of the expected '\r\n'

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

Редактировать:

Для тех, кто задавался вопросом, зачем мне нужно внутреннее окончание CRLF: я копирую текст в буфер обмена Windows, и пользователь часто копирует этот контент в Блокнот, и без окончания CRLF конец строки теряется во время этой последней операции....

Мое решение:

Наконец, я решил использовать библиотеку boost, чтобы заменить \n на \r\n:

boost::replace_all( str, "\n", "\r\n" );

person JMD    schedule 29.03.2011    source источник
comment
Это верно. std::ostringstream использует представление внутренней текстовой строки. CRLF используется для представления текста на диске. Если вы читаете с std::ifstream по std::string, вы ожидаете, что CRLF преобразуется во внутреннее представление. Так что все ожидают, что std::string в любой момент будет содержать внутреннее текстовое представление.   -  person Serge Dundich    schedule 29.03.2011


Ответы (2)


Что ж, '\n' является внутренним представлением конца строки.

Просто когда вы записываете во внешний файл, он преобразуется (при необходимости!) во внешнее представление. В некоторых системах окончание строки состоит из одного символа или даже вообще без символа, если вместо этого сохраняется скрытое значение длины.

person Bo Persson    schedule 29.03.2011

Различие между текстовым и двоичным режимами чисто std::filebuf. В другом месте это не актуально.

Я не уверен, почему вам нужно что-то кроме "\n" во внутренней строке, но это не сложно: просто определите

char const newline[] = "\x0D\x0A";  //  Or whatever the convention is

и выведите это.

person James Kanze    schedule 29.03.2011
comment
Я надеялся, что он также сможет выполнить преобразование без создания файла. Ну, я думаю, я просто добавлю параметр новой строки в свою функцию, спасибо всем. - person JMD; 29.03.2011