Ответ 1
Проблема, с которой вы столкнулись, заключается в том, что по умолчанию std::stringstream
создается с помощью ios_base::openmode mode = ios_base::in|ios_base::out
, который является неприемлемым.
Здесь вы интересуетесь режимом вывода (например: ios_base::openmode mode = ios_base::out
)
std::basic_stringbuf::str(const std::basic_string<CharT, Traits, Allocator>& s)
работает по-разному, в зависимости от openmode
:
-
mode & ios_base::ate == false
: (то есть: не добавляемые выходные потоки):str
установитpptr() == pbase()
, так что последующий вывод будет перезаписать символы, скопированные из s -
mode & ios_base::ate == true
: (то есть: добавить выходные потоки):str
установитpptr() == pbase() + s.size()
, так что последующий вывод будет добавлен к последнему символу, скопированному из s
(Обратите внимание, что этот добавочный режим новый, поскольку С++ 11)
Более подробную информацию можно найти здесь.
Если вы хотите добавить поведение, создайте stringstream
с помощью ios_base::ate
:
std::stringstream ss(std::ios_base::out | std::ios_base::ate)
Простой пример приложения здесь:
#include <iostream>
#include <sstream>
void non_appending()
{
std::stringstream ss;
std::string s = "hello world";
ss.str(s);
std::cout << ss.str() << std::endl;
ss << "how are you?";
std::cout << ss.str() << std::endl;
}
void appending()
{
std::stringstream ss(std::ios_base::out | std::ios_base::ate);
std::string s = "hello world";
ss.str(s);
std::cout << ss.str() << std::endl;
ss << "how are you?";
std::cout << ss.str() << std::endl;
}
int main()
{
non_appending();
appending();
exit(0);
}
Это будет выводиться двумя различными способами, как описано выше:
hello world
how are you?
hello world
hello worldhow are you?