读书人

iostate的1点疑惑

发布时间: 2012-09-10 11:02:32 作者: rapoo

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的情况,一般情况下是保存流数据的数据结构发生异常,通过体现在内存层次。
希望对你有所帮助。

读书人网 >C++

热点推荐