Как использовать 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("");

Другие вопросы по тегам