iostate的一点疑惑C/C++ code#includeiostream#includevectorint main(){std::istream::iostate stin
iostate的一点疑惑
C/C++ code#include<iostream>#include<vector>int main(){ std::istream::iostate st; int i; std::cin>>i; st=std::cin.rdstate(); std::cout<<"badbit:"<<std::istream::badbit<<std::endl <<"failbit:"<<std::istream::failbit<<std::endl <<"eofbit:"<<std::istream::eofbit<<std::endl <<"st:"<<st<<std::endl; std::vector<int>ivec; while(std::cin>>i) ivec.push_back(i); std::cout<<"new state:"<<std::cin.rdstate()<<std::endl; return 0;}
如上面的代码.在我的机器上输出三种iostate类型的值,发现failbit=4,badbit=1,eofbit=2
上面两次输入,无论是哪次用ctrl D ,输出的cin的状态都是6.也就是failbit+eofbit
那么是不是说这eofbit的出现必定伴随着failbit?
还有,badbit什么情况下才会出现?
[解决办法]eofbit的出现必定伴随着failbit?不是的。
eofbit指得是数据从输入流中提取并解析完毕后,没有更多的数据需要处理,即达到了输入流的末尾。而failbit则指得是从输入流中提取数据并解析时发生错误,即出现了不能按照某种规则解析的情况。这二者并非常常同时发生。
一个典型的例子是从点云文件中读取所有行数据,然后将每一行解析为x,y,z坐标值,如:
std::string str;
while (std::getline(infile, str)) {
std::istringstream is(str); // 假设str的内容为 "1.1 2.2 3.3"
double x, y, z;
is >> x >> y >> z; // 这一行执行完毕后,is的状态为eofbit,因为在将1.1, 2.2, 3.3分别
// 赋值给x, y, z后,is已经将流数据全部处理完毕,
// 没有更多数据可以处理 了。
// 但是如果str的内容为"1.1 2.2 3.3 4.4"的话,is的状态依然为goodbit
// 因为赋值成功,而且未到达流数据的末端
// 但是如果str的内容为"1.1 ttt 3.3"的话,x被成功赋值1.1,但是在将
// ttt解析为double时将失败,于是is的状态为仅仅failbit.
}
而对于badbit的情况,一般情况下是保存流数据的数据结构发生异常,通过体现在内存层次。
希望对你有所帮助。