从字符串读入stringstream

Leo*_*olo 4 c++ string stringstream

当我尝试从字符串中解析空白分隔的double值时,我发现了这种奇怪的行为,即以循环方式读出字符串.

这是程序:

stringstream ss;
string s("1 2 3 4");
double t;
list<double> lis;

for(int j=0; j!=10; ++j){
    ss << s;
    ss >> t;
    lis.push_back(t);
}

for(auto e : lis){
    cout << e << " ";
}
Run Code Online (Sandbox Code Playgroud)

这里输出:

1 2 3 41 2 3 41 2 3 41
Run Code Online (Sandbox Code Playgroud)

如果我追加尾随空间,s= "1 2 3 4 ";我得到

1 2 3 4 1 2 3 4 1 2 
Run Code Online (Sandbox Code Playgroud)

现在问题:
1)如果我不知道字符串s中有多少条目,我如何读入列表中的所有条目?
2)operator<<我实际上是在打电话ss << s;?是否指定循环阅读?
3)我可以更好地解析吗?

谢谢!


这是固定代码(感谢timrau):

// declarations as before
ss << s;
while(ss >> t){
   lis.push_back(t);
}
// output as before  
Run Code Online (Sandbox Code Playgroud)

这会产生:

 1 2 3 4  
Run Code Online (Sandbox Code Playgroud)

如预期的.(在处理下一个输入之前,不要忘记清除你stringstreamss.clear().)))

来自HeywoodFloyd的另一个有用的评论:One也可以使用boost/tokenizer来"拆分"字符串,请参阅这篇文章

tim*_*rau 7

你可以测试的返回值>>.

while (ss >> t) {
    lis.push_back(t);
}
Run Code Online (Sandbox Code Playgroud)

它没有指定循环阅读.它ss << s附加"1 2 3 4"到流的末尾.

在第一个循环之前:

""
Run Code Online (Sandbox Code Playgroud)

第一次之后ss << s:

"1 2 3 4"
Run Code Online (Sandbox Code Playgroud)

第一次之后ss >> t:

" 2 3 4"
Run Code Online (Sandbox Code Playgroud)

第二次之后ss << s:

" 2 3 41 2 3 4"
Run Code Online (Sandbox Code Playgroud)

然后很明显,1 2 3 41 2 3 41 2 3 41如果没有尾随空间,你会得到什么s.