iostate遇到的一个问题,大侠请指教

kiwigiving 2009-11-24 11:18:55
#include <iostream>
#include <stdexcept>
using namespace std;

void main()
{
int ival = 0;
while (cin >> ival, !cin.eof())
{
try {
if (cin.bad())
throw runtime_error("IO stream corrupted");
if (cin.fail()) {
cerr << "bad data, try again" << endl;


/* 用cin.clear()程序运行正常,为什么我将cin.clear()改成
* cin.clear(istream::failbit))之后输入一个字符,比如'a',
* 会陷入死循环,不断地输出"bad data, try again",不是failbit
* 错误标志已经被恢复正常了吗?还有,若将cin.clear()改成
* cin.clear(istream::failbit | istream::badbit),然后输入一个
* 字符'a',会陷入一个死循环,但是不断地输出"IO stream corrupted"呢?
*/

cin.clear(); // 改成cin.clear(istream::failbit)或
// cin.clear(istream::failbit | istream::badbit)
// 会出现两种不同的错误情况呢呢?

cin.sync();
continue; }

cout << "The twice of the varible is " << 2 * ival << endl;
} catch(runtime_error err) {
cout << err.what() << endl;
}
}
}
...全文
164 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hallowwar 2009-11-24
  • 打赏
  • 举报
回复
关注,hai040继续努力吧。
kiwigiving 2009-11-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hai040 的回复:]
引用 3 楼 kiwigiving 的回复:
cin.clear()不是将某个指定的条件状态设置为有效吗?

cin.clear(istream::failbit)把fail设成真
cin.clear(istream::failbit | istream::badbit)把fail & bad设成真
clear应该是=而不是|=
setstate才是|=
[/Quote]
我用您的方法试了一下,不对啊。您可以试一下看。
不过我觉得您的这种个说法还是有点不对,
如果cin.clear(istream::failbit)把fail设成真,那么cinl.clear()是不是
把istream::failbit,eofbit,badbit都设成真了?
我刚刚拿书去翻阅了一下,我还是觉得我的说法是正确的。
我再看看其他大虾的意见看。不过还是谢谢你~
hai040 2009-11-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kiwigiving 的回复:]
cin.clear()不是将某个指定的条件状态设置为有效吗?
[/Quote]
cin.clear(istream::failbit)把fail设成真
cin.clear(istream::failbit | istream::badbit)把fail & bad设成真
clear应该是=而不是|=
setstate才是|=
kiwigiving 2009-11-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hai040 的回复:]
clear的名字起错了,其实应该叫set
cin.clear(istream::failbit)是把状态设成fail
[/Quote]
不是的吧?cin.clear()不是将某个指定的条件状态设置为有效吗?
而setstate是将流指定为某个条件状态吧?
kiwigiving 2009-11-24
  • 打赏
  • 举报
回复
刚刚我将catch块加上了
catch(runtime_error err) {
cout << err.what() << endl;
cin.clear();
cin.sync();
}
这样,虽然在cin.clear(istream::failbit | istream::badbit)的情况下,
我输入字符,不会陷入死循环,但是会输出
"bad data, try again"
"IO stream corrupted"
可见,先出现了cin.fail(),后又抛出了一个runtime_error的错误,这是为什么啊?
hai040 2009-11-24
  • 打赏
  • 举报
回复
clear的名字起错了,其实应该叫set
cin.clear(istream::failbit)是把状态设成fail
kiwigiving 2009-11-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hai040 的回复:]
clear的名字起错了,其实应该叫set
cin.clear(istream::failbit)是把状态设成fail
[/Quote]
您说的是正确的,刚刚非常抱歉。
我刚开始也太快地浏览了您的答案,我还以为你那个set是让我改成
setstate()函数呢~
我刚在网上查阅了一些资料后,终于发现什么原因了。
ios_base::clear(state)
将流s标志位设置为state,默认参数为goodbit

ios_base::setstate(state)
为流s添加指定的标志位state,原来的标志位仍然存在,相当于调用
clear(state | rdstate())

这个真的很容易搞混的。
如果我的程序那句代码改成:cin.clear(istream::failbit ^ cin.restate())
这样通过一个位运算就可以将条件状态的failbit位恢复了。这样就可以了。
为了避免错误,发现还是用cin.clear()比较好~


64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧