Какова цель конструктора строк ostringstream?

В MSVC 2005 у меня есть следующий код.

std::ostringstream stream("initial string ");
stream << 5;
std::cout << stream.str();

Я ожидаю:

initial string 5

Я получаю:

5nitial string

Инициализируя поток строкой, я бы ожидал, что поток переместит свою позицию в конец исходной строки. Очевидно, что STL не согласен со мной (не в первый раз).

Какова цель такого поведения? Является ли этот вариант использования полезным для чего-либо? Кроме того, есть ли способ продвинуть позицию потока до конца исходной строки?

Ответы

Ответ 1

Использование ostringstream и предоставление начального значения подобно открытию существующего файла для записи. У вас есть данные, и если вы не укажете иное, ваша начальная позиция будет в начале данных. Вы можете искать в данных или указать ios::ate, чтобы сначала поместить указатель записи в конец существующих данных, или вы можете указать ios::app, чтобы всегда помещать указатель записи в конец существующих данных.

Ответ 2

Вы можете указать второй (дополнительный) параметр конструктора для установки курсора потока в конце:

std::ostringstream stream("initial string ", std::ios::ate);

Ответ 3

Чтобы достичь цели, сделайте следующее:

stream.seekp(0, ios_base::end);

Что касается позиции записи по умолчанию для фронта, я не знаю.