stringstream 通过字符串直接初始化后clear失效?(语言-c++)

stringstream 通过字符串直接初始化后clear失效?
其实从rdstate的返回值来看的话,clear的效果是还有的,复原了状态值,但无法让字符串流再流入string型变量

#include <vector>
#include <sstream>
#include <string>
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
    int flag;
    scanf("%d ", &flag);//是与问题无关的int变量
    vector<string>first, second;//两个vector 容器,分别存储第二行和第三行的字符串
    string str1, str2,tmp;
    getline(cin, str1);
    getline(cin, str2);//输入
    stringstream input;//应用字符串流,第二次操作时改为stringstream input(str1);
    input << str1;//读入字符串,第二次操作时这一行不要了
    cout << input.rdstate() << endl;
    while (input >> tmp)
        first.push_back(tmp);//生成<string>vector
    cout << input.rdstate() << endl;
    input.clear();
    cout << input.rdstate() << endl;
    input << str2;
    cout << input.rdstate() << endl;
    while (input >> tmp)
        second.push_back(tmp);
    cout << input.rdstate() << endl;
    cout << first.size() << endl << second.size() << endl;
    return 0;
}

这样操作是正常的,第一次结果如下

img

第二次操作对代码的修改只是改变了字符串流对象的初始化方式,详见代码注释
结果如下

img

注意到两次输出唯一的差别在于第二个vector的size是否为空。请问各位king谁能解释其中的原理?

  • 以下回答由chatgpt基于相关博客总结生成:

    对于stringstream,通过字符串初始化后,里面已经是一个完整的字符串了,所以clear并不能清空里面的内容,只是为了用来清空标志位。如果想要再次输入流,可以使用str函数将其清空,再输入新的数据。

    具体步骤如下: 1. 通过stringstream的构造函数,将字符串初始化为一个stringstream对象。

    stringstream ss("1 2 3");
    
    1. 使用>>操作符将stringstream对象中的数字流入一个int型的变量。
    int num;
    ss >> num;
    
    1. 使用clear清空标志位,并使用str函数清空stringstream对象。
    ss.clear();
    ss.str("");
    
    1. 通过>>操作符再次将stringstream对象中的数字流入其他变量中。
    int num2;
    ss >> num2;
    

    对于第二个问题,通过输出rdstate的返回值可以看出clear的效果,因为rdstate的返回值反映了stringstream对象的状态。当第一次输入时,stringstream对象中没有任何错误,rdstate返回0。当第二次输入时,由于字符串中只有一个数字,所以读取完后并没有结束读入,所以rdstate返回4(EOF)。而不管是0还是4,执行clear操作后都应该是可以再次输入的,如果第二个vector的size为空,很有可能是没有清空或者没有正确输入到vector中。

    代码示例如下:

    #include <iostream>
    #include <sstream>
    #include <vector>
    
    using namespace std;
    
    int main() {
        stringstream ss("1 2 3");
        int num1, num2, num3;
        ss >> num1;
        ss >> num2;
        ss >> num3;
        cout << ss.rdstate() << endl;
        ss.clear();
        ss.str("");
        stringstream ss2("4");
        ss2 >> num1;
        ss2 >> num2;
        vector<int> vec;
        ss2 >> num3;
        vec.push_back(num1);
        vec.push_back(num2);
        vec.push_back(num3);
        cout << ss2.rdstate() << endl;
        cout << vec.size() << endl;
        return 0;
    }
    

    输出结果:

    0
    4
    3