Подтвердить что ты не робот

Постановка содержимого std:: stringstream с помощью str (const char *) имеет странные последствия

Я использую std::stringstream для генерации кода. При настройке содержимого с помощью функции str() я столкнулся с каким-то сомнительным поведением, а затем с помощью operator<<. Может кто-нибудь объяснить мне такое поведение. Я был бы очень благодарен за это. Спасибо.

Пример 1:

std::stringstream ssa;
ssa.str("Setting string");
std::cout << ssa.str() << std::endl;
ssa << " adding to string";
std::cout << ssa.str() << std::endl;

Вывод:

Установка строки

добавление в строку

Ожидаемое:

Установка строки

Установка строки добавления в строку

Итак, после небольшого чтения документации я обнаружил, что должен установить открытый режим ios_base::ate:

std::stringstream ssb(std::ios_base::ate);
ssb.str("Setting string");
std::cout << ssb.str() << std::endl;
ssb << " adding to string";
std::cout << ssb.str() << std::endl;

Вывод:

Установка строки

Установка строки

Снова (или сейчас) я бы ожидал:

Установка строки

Установка строки добавления в строку

Почему я получаю результаты, которые есть, и как мне получить результат, который я хочу? Э.И. Возможность установить начальный string параметра stringstream и добавить к нему string?

Мне известно, что я могу просто установить содержимое пустым string(""), а затем использовать только <<operator. Это на самом деле обходной путь, который я использую. Я просто не понимаю наблюдаемого поведения. И обходной путь делает мой код более запутанным.

4b9b3361

Ответ 1

Вы забыли установить режим флага: std::ios_base::out. Это будет работать:

std::stringstream ssb(std::ios_base::out | std::ios_base::ate);
ssb.str("Setting string");
std::cout << ssb.str() << std::endl;
ssb << " adding to string";
std::cout << ssb.str() << std::endl;

Вывод:

Setting string
Setting string adding to string

Ответ 2

Режим открытого по умолчанию для объекта std::stringstream - in | out. Использование другого режима отменяет эти параметры. Поскольку поток не может быть записан, оператор вставки не может использоваться для записи в поток. Вот почему str() дает тот же результат дважды.

Вам также нужно вручную открыть поток в режиме вывода:

std::stringstream ssb("Setting string", std::ios_base::out | std::ios_base::ate);

Live Demo

В качестве альтернативы используйте std::ostringstream, который инициализирует подобъект std::stringbuf с out | mode.

std::ostringstream("Setting string", std::ios_base::ate);

Live Demo