数据不好,再试一次
Bad data, try again
我在一本书中找到了这个代码片段:
int ival;
// read cin and test only for EOF; loop is executed even if there are other IO failures
while (cin >> ival, !cin.eof()) {
if (cin.bad()) // input stream is corrupted; bail out
throw runtime_error("IO stream corrupted");
if (cin.fail()) { // bad input
cerr<< "bad data, try again"; // warn the user
cin.clear(istream::failbit); // reset the stream
istream::iostate cin_state = cin.rdstate();
continue; // get next input
}
// ok to process ival
}
如果我在命令窗口点击"f",那么无数个"坏数据,再试一次",cin_state为0X02,等于badbit。Failbit一直不清楚,为什么?
问题是f
从未从输入流中删除,因此cin >> ival
一直试图一遍又一遍地读取它。
你需要跳过它。例如,istream::ignore()是如何工作的?
虽然NPE关于不从流中删除违规数据的观点是正确的,但这并不是唯一(或最严重)的问题。
您应该使用cin.clear()
,由于默认参数,它与cin.clear(ios_base::goodbit)
相同。正如你在评论中推测的那样,cin.clear(istream::failbit)
不会将cin
重置为良好状态。实际上,将流设置为失败状态。这似乎违反直觉,但是clear
将流的状态设置为(或"清除为")传递的参数。关于它的操作还有其他一些细节,但它们与本文讨论无关。
确保在ignore
之前调用clear
,否则后者将不起作用。最后,为了防止任意长的无效条目,将std::numeric_limits<int>::max()
作为第一个参数传递给ignore
。
修改后的代码片段应该是:
int ival;
// read cin and test only for EOF; loop is executed even if there are other IO failures
while (cin >> ival, !cin.eof()) {
if (cin.bad()) // input stream is corrupted; bail out
throw runtime_error("IO stream corrupted");
if (cin.fail()) { // bad input
cerr<< "bad data, try again"; // warn the user
cin.clear(); // or cin.clear(istream::goodbit);
istream::iostate cin_state = cin.rdstate();
cin.ignore(std::numeric_limits<int>::max(), 'n');
continue; // get next input
}
// ok to process ival
}
至于你为什么在c++ Primer中找到这个,我不能说。我没有读过这本书,但我知道它写得很好。我建议你检查一下你的版本有多旧,并查找一个勘误表。
相关文章:
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 在C++中一次将矢量值写入多个文件
- 只需按一次按钮即可通过USB发送数据
- 如何遍历几个每小时一次的根(.root)文件,并将它们组合成更大的每日数据.root文件?
- (C++)如何修改/使用数据结构,以便我们可以一次又一次地使用它们?
- 一次发布多个数据
- 如何在返回一次数据后从类实例中删除数据
- 使数据输入字段记住其值,从一次运行到下一次运行
- 如何从字符串中每隔16个字节复制一次数据
- 从文件中读取数据 - 存储在变量中或一次又一次地读取
- 如何只训练我的数据一次
- 是否可以创建一个类似C的字符串(char*)数据只能设置一次的结构
- QTcpSocket每~0.5s才读取一次数据,即使是非常小的数据包,任何方法都可以加快速度
- 如何使用数据类型的一次返回来返回错误
- c++ irc bot只接收一次数据
- 按类型在一组数据成员中进行选择,其中每种类型仅使用一次
- 数据不好,再试一次
- 逐行读取数据,但不是一次全部读取
- C++,一次接受后无法接收数据和无效套接字