如何使用相同的stringstream
对象标记两个不同的字符串?
我正在尝试以下代码,但它不起作用:
using namespace std;
void check()
{
stringstream s( "This is a test");
string token;
while (s>>token)
{
cout<< token <<'\n';
}
s.str("hello world");
while ( s>> token )
{
cout<< token <<'\n';
}
}
int main()
{
check();
int z;
cin>>z;
}
答案 0 :(得分:3)
您需要通过s.clear();:
重置流标记stringstream my_stringstream( "This is a test");
string token;
while ( my_stringstream >> token )
{
cout<< token <<'\n';
}
my_stringstream.str("hello world");
my_stringstream.clear();
while ( my_stringstream >> token )
{
cout<< token <<'\n';
}
当您在第一个while循环中使用>>
到达流的末尾时,将设置eof位。这就是为什么你需要调用clear()来重置流,如答案所示
谢谢Jesse Good的补充。
答案 1 :(得分:0)
这一行:
while (s >> token)
......确实很多。除了从token
获取s
之外,operator>>还会返回流(s
)。然后while
按converting it to either a bool
(since C++11) or a void*
(before C++11)评估此s
。这基本上与!
fail()
相同。现在,如果fail()
返回true
并且您已经退出第一个循环,那么在eofbit
,badbit
和/或{{{{}}之前,您不会进入第二个循环1}}已被重置。您可以使用clear()
重置这些内容,如下所示:
failbit