C++ 如何使用动态大小读取stringstream?

C++ 如何使用动态大小读取stringstream?,c++,stringstream,C++,Stringstream,我想用stringstream做一个实验,但我对它的工作原理有点困惑。我快速搜索了一下,但找不到任何能回答我问题的东西 假设我有一个动态大小的流,我如何知道何时停止写入变量 string var = "2 ++ asdf 3 * c"; stringstream ss; ss << var; while(ss){ ss >> var; cout << var << endl; } 我不知道为什么我会在最后得到那个额外的“c”

我想用stringstream做一个实验,但我对它的工作原理有点困惑。我快速搜索了一下,但找不到任何能回答我问题的东西

假设我有一个动态大小的流,我如何知道何时停止写入变量

 string var = "2 ++ asdf 3 * c";
 stringstream ss;

 ss << var;

 while(ss){
  ss >> var;
  cout << var << endl;
 }

我不知道为什么我会在最后得到那个额外的“c”,特别是因为_m_in_cur=0x1001000d7”“

您会在最后得到额外的
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)//测试流是否良好
{
ss>>var;//尝试提取var)//尝试提取,然后测试流是否良好
{

cout还有一个成员函数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
}
while(ss.good())//检查流是否可用于io
{

ss>>var;//尝试提取while(ss)中的
代码中的条件检查检查上次从流中读取是否成功。但是,即使已读取字符串中的最后一个字,此检查也将返回true。只有代码中的下一次提取
ss>>var
将使此条件为false,因为流已结束&th变量var中没有什么可提取的内容。这就是为什么在结尾处会有一个额外的“c”。您可以按照James McNellis的建议更改代码来消除这一点。

事实上,它是一个stringstream,并没有什么变化——您可以像读取任何其他流一样读取它。谢谢,我想我的问题应该是这样的d作为如何检查流的条件。在一般情况下,这仍然是不正确的:如果您试图提取
int
,并且缓冲区中的下一个可用字符无法读取为
int
,则提取将失败。
while (ss >> var) // attempt extraction then test if stream is good
{
    cout << var;  // use result of extraction
}
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
}