求高手解答一段小程序的输出结果为什么会是这样的!
#include<iostream>
using namespace std;
int main()
{
int ival;
while (cin >> ival , !cin.eof())
{
if (cin.bad())
{
throw runtime_error ("IO stream Corrupted");
}
if (cin.fail())
{
cerr << "bad data, try again" << endl;
cin.clear(istream::failbit);
continue;
}
}
return 0;
}
输入:q ,再按回车键
输出:
bad data, try again
bad data, try again
bad data, try again
bad data, try again
bad data, try again
bad data, try again
………………………………
问题:我认为结果应该是输出 一句bad data, try again后,再让我进行输入字符操作,而不是一执死循环下去。求高手回答为什么结果会是这样。
[解决办法]
if (cin.fail())
{
cerr << "bad data, try again" << endl;
//cin.clear(istream::failbit);
std::cin.clear();// 恢复状态标志
std::cin.ignore(10, '\n');// 略过缓存
continue;
}
[解决办法]
是回车符的问题,你输出了q之后,然后按了回车。
加上 getchar();
可在 if (cin.fail()) 里面或者外面加都行。
[解决办法]
你定义的是int,输入q,会设置failbit位,同时q字符仍留在cin对象的输入流中,你的代码中并没有清理它,所以就死循环了。修改后如下:
#include<iostream>
using namespace std;
int main()
{
int ival;
while (cin >> ival , !cin.eof())
{
if (cin.bad())
{
throw runtime_error ("IO stream Corrupted");
}
if (cin.fail())
{
cerr << "bad data, try again" << endl;
cin.clear(istream::goodbit);// 等同于cin.clear(),清除所有状态位
while (cin.get() != '\n')
continue;// 读取并丢弃上次输入留在缓冲流中的字符
// continue;// 此语句可有可无
}
}
return 0;
}
你也可以将
while (cin.get() != '\n')
continue;
替换成cin.get();
清理掉q字符就好了