Какова цель строкового конструктора ostringstream? - PullRequest
14 голосов
/ 01 октября 2010

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

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

То, что я ожидаю, это:

initial string 5

Что я получаю:

5nitial string

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

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

Ответы [ 3 ]

19 голосов
/ 01 октября 2010

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

15 голосов
/ 01 октября 2010

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

std::ostringstream stream("initial string ", std::ios::ate);
4 голосов
/ 01 октября 2010

Чтобы стремиться к концу, сделайте это:

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

Относительно того, почему положение записи по умолчанию впереди, я не знаю.

...