我想尝试使用stringstream进行分配,但我对它的工作原理有点困惑。我做了一个快速搜索,但找不到任何能回答我问题的东西。
假设我有一个动态大小的流,我怎么知道何时停止写变量?
string var = "2 ++ asdf 3 * c";
stringstream ss;
ss << var;
while(ss){
ss >> var;
cout << var << endl;
}
我的输出是:
2
++
asdf
3
*
c
c
我不知道为什么我最后得到额外的'c',特别是因为_M_in_cur = 0x1001000d7“”
答案 0 :(得分:20)
你最后得到额外的c
,因为你在执行提取后没有测试流是否仍然是好的:
while (ss) // test if stream is good
{
ss >> var; // attempt extraction <-- the stream state is set here
cout << var; // use result of extraction
}
您需要在执行提取和使用结果之间测试流状态。通常,这是通过在循环条件下执行提取来完成的:
while (ss >> var) // attempt extraction then test if stream is good
{
cout << var; // use result of extraction
}
答案 1 :(得分:0)
代码中的while(ss)
条件检查检查流中的最后一次读取是否成功。但是,即使您已读取字符串中的最后一个单词,此检查也将返回true。只有代码中的ss >> var
的下一次提取才会使此条件成为错误,因为已达到流的末尾&amp;没有什么可以提取到变量var中。这就是你最后获得额外'c'的原因。您可以通过更改James McNellis建议的代码来消除此问题。
答案 2 :(得分:-1)
还有一个成员函数good(),它测试流是否可用于I / O操作。因此使用此代码可将上述代码更改为
while(ss.good()) // check if the stream can be used for io
{
ss >> var; // attempt extraction <-- the stream state is set here
cout << var; // use result of extraction
}