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;
}
这样操作是正常的,第一次结果如下
第二次操作对代码的修改只是改变了字符串流对象的初始化方式,详见代码注释
结果如下
注意到两次输出唯一的差别在于第二个vector的size是否为空。请问各位king谁能解释其中的原理?
对于stringstream,通过字符串初始化后,里面已经是一个完整的字符串了,所以clear并不能清空里面的内容,只是为了用来清空标志位。如果想要再次输入流,可以使用str函数将其清空,再输入新的数据。
具体步骤如下: 1. 通过stringstream的构造函数,将字符串初始化为一个stringstream对象。
stringstream ss("1 2 3");
int num;
ss >> num;
ss.clear();
ss.str("");
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