抛出问题:
先附上书本中的例题程序代码
#include <iostream> int main(){ int ival; while (std::cin >> ival, !std::cin.eof()){ if (std::cin.bad()) throw std::runtime_error("IO stream corrupted"); if (std::cin.fail()){ std::cerr << "bad data, try again" << std::endl; std::cin.clear(std::istream::failbit); continue; } } return 0; }
在输入正常时,没有什么问题。在输入字母时,就会一直打印“bad data, try again”这句话,效果如下所示:
解决问题方案:
我肯定不想让结果无限的打印,然后就开始查找原因,主要是因为没有清空输入流的缓存区的原因。所以我就对程序代码进行了一些修改,
#include <iostream> #include <limits> int main(){ int ival; while (std::cin >> ival, !std::cin.eof()){ if (std::cin.bad()) throw std::runtime_error("IO stream corrupted"); if (std::cin.fail()){ std::cerr << "bad data, try again" << std::endl; //修正cin状态 std::cin.clear(std::istream::failbit); //std::cin.clear(); //清空缓存区 //std::cin.sync(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cout << std::cin.fail() << std::endl; continue; } } return 0; }
但是这个时候还是看不到正确的结果,还是无限的打印。经过调试发现,是因为对failbit的设置没有起作用。但是用cin.clear()时就有效。虽然已经达到了我要的结果,但是为什么cin.clear(istream::failbit)没有效果呢,明明书上是这么写的啊。心里抱着各种怀疑的态度去stackoverflow上查查,果不其然有个人和我一样有这个问题,下面一个人的回答没怎么看懂,不过大体意思就是cin.clear(istream::failbit)不能真正的重置这个状态。
http://stackoverflow.com/questions/11246960/resetting-the-state-of-a-stream/11247530#11247530 (问题地址)
最后修改后的代码如下:
#include <iostream> #include <limits> int main(){ int ival; while (std::cin >> ival, !std::cin.eof()){ if (std::cin.bad()) throw std::runtime_error("IO stream corrupted"); if (std::cin.fail()){ std::cerr << "bad data, try again" << std::endl; //修正cin状态 //方法一: std::cin.clear(~std::istream::failbit & std::cin.rdstate()); //方法二: //std::cin.clear(); //清空缓存区 //方法一: std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //方法二: //std::cin.sync(); std::cout << std::cin.fail() << std::endl; continue; } } return 0; }
时间: 2024-10-18 23:03:08