Я пытаюсь использовать 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" );
std::ostringstream
использует представление внутренней текстовой строки. CRLF используется для представления текста на диске. Если вы читаете сstd::ifstream
поstd::string
, вы ожидаете, что CRLF преобразуется во внутреннее представление. Так что все ожидают, чтоstd::string
в любой момент будет содержать внутреннее текстовое представление. - person Serge Dundich   schedule 29.03.2011