Как использовать std::end для перезаписи строки в std::ostringstream?
Я хочу перезаписать строку в std::ostringstream
но std::ends
не работает Это проблема с VS2012, или я делаю что-то не так? Вот пример кода:
std::ostringstream foo;
foo << "1,2,3,4,5,6";
std::cout << foo.str(); // prints: 1,2,3,4,5,6
foo.clear();
foo.seekp( std::ios_base::beg );
foo << "A,B,C" << std::ends;
std::cout << foo.str(); // prints: A,B,C,4,5,6 NOT just: A,B,C
РЕДАКТИРОВАТЬ:
Я получаю много ответов, которые могу использовать foo.str( std::string() )
очистить строку... Я знаю это. Отсюда вытекает вопрос: как повторно использовать острингстрим? Я пытаюсь не перераспределять буфер.
4 ответа
На самом деле это печатает
Обратите внимание [NUL]
что соответствует std::ends
и сделал запятую после 3
ostringstream::str()
Функция возвращает контейнер, который отслеживает его длину и игнорирует все возможные символы окончания строки.
так, чтобы получить формат, который учитывает символ окончания строки, вы можете, например, использовать char *
(или же wchar_t*
если компилируется с поддержкой юникода) представление получено через std::string::c_str()
как это foo.str().c_str();
Почему вы используете std::ends
? Это то, что осталось от дней std::ostrstream
где это гарантировало, что генерируется char[]
был нулевым Вы обычно не хотите использовать его на std::ostringstream
,
В коде, который вы представляете, мне кажется, что вы действительно хотите, это два отдельных std::ostringstream
(хотя можно очистить данные, позвонив foo.str( "" );
).
Если вы просто хотите перезаписать содержимое строки, просто используйте str(new_string)
метод вроде так:
std::ostringstream foo;
foo << "1,2,3,4,5,6";
std::cout << foo.str(); // prints: 1,2,3,4,5,6
// clear just reset error state flags
foo.clear();
// Replace the content of the stream
foo.str("A,B,C");
std::cout << foo.str(); // Should print: A,B,C
или же:
// clear just reset error state flags
foo.clear();
// Clear content of the stream
foo.str("");
foo << "A,B,C";
В третьем утверждении foo.clear() не удаляет данные в foo. В 4-м утверждении вы использовали положение файла, чтобы указать начало. поэтому следующий оператор принимает значения с начала, поэтому значения 1,2,3 перезаписываются A,B,C
вместо foo.clear() используйте foo.str("");