注册 登录
编程论坛 C++教室

[求助]一段流状态的查询和控制代码。

aipb2007 发布于 2007-04-16 15:25, 908 次点击
#include <iostream>
using namespace std;

void 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";
cin.clear(istream::failbit);
continue;
}
}
}
书上抄下来的,结果运行结果不是所期望的!运行下就知道了,期望输入整形值。
若遇到输入非整形值就提示出错并重新输入。
但是我输入为字符的时候就出现了无限循环!

点解,谢谢!
8 回复
#2
wangxiang2007-04-16 16:19

#include <iostream>
#include <stdexcept>
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";
cin.clear();
cin.ignore();
continue;
}
}

return 0;
}

#3
aipb20072007-04-16 19:31
楼上的,能解释下修改的原因吗?还有我哪里错了?
#4
游乐园2007-04-16 19:49
cin.clear() //只是清除了错误标记位 但没有清空输入流 残余的回车会构成无限循环的
用cin.ignore() 来清空输入流就可以了
#5
aipb20072007-04-16 20:56
以下是引用游乐园在2007-4-16 19:49:51的发言:
cin.clear() //只是清除了错误标记位 但没有清空输入流 残余的回车会构成无限循环的
用cin.ignore() 来清空输入流就可以了

再请教下,clear()和clear(istream::failbit)有哪不一样,我的理解就是后者是清除特定的错误状态,那在我的代码中两者作用就该一样。但是
用cin.clear();
cin.ignore();
和cin.clear(istream::failbit);
cin.ignore();
后者仍然有那个问题。

还有,我发现
用cin.clear();
cin.get();
也行,难道 get()也清空输入流?


麻烦解答下,不懂啊!

#6
游乐园2007-04-16 22:12
cin.clear(istream::failbit);// 是清除错误标志位 failbit 是设置错误但可挽回的标志位

应该为 cin.clear(istream::goodbit); //清除后 设置正确的标志位

get() //也可以清空输入缓冲区
#7
aipb20072007-04-16 22:43

谢谢了,

c++primer也会有错

#8
游乐园2007-04-17 10:30
这种经典著作应该没有错吧

不知道 C++primer 里用的是哪种编译器
#9
aipb20072007-04-17 10:37

反正不是VC,里面很多代码在都跟VC运行的结果不符合!

呵呵~

1