CRLF конец строки и острингстрим - PullRequest
3 голосов
/ 29 марта 2011

Я пытаюсь использовать 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), но полученный буфер символов не содержит ожидаемогоКонец строк CRLF ....

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

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

Мое решение:

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

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

Ответы [ 2 ]

2 голосов
/ 29 марта 2011

Ну, '\ n' - это внутреннее представление конца строки.

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

1 голос
/ 29 марта 2011

Отличительный текстовый режим / бинарный режим - это просто std :: filebuf. Это не актуально в другом месте.

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

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

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

...