流状态的查询和控制

wbj2009 2011-01-13 01:51:02
在C++Pimer上看了一段关于流状态的查询和控制的小程序,结果在调试时出现了点小问题,请教各位高手:

#include<iostream>
#include<string>
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!"<<endl;
cin.clear(istream::failbit);
continue;
}
}
system("pause");
}

在调试时如果输入字母就一直在第二个if循环里跑个不停,一直输出Bad data,try again!,这是因为什么?

...全文
123 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
itslmde 2011-01-17
  • 打赏
  • 举报
回复
要清除failbit应该这样写:cin.clear(cin.rdstate() & ~iso::failbit);
itslmde 2011-01-17
  • 打赏
  • 举报
回复
cin.clear(istream::failbit); 你可知道这一句的意思?
并非是你想像的清除failbit,而是。。。唔,cin.clear(status)相当于cin.clear(), cin.setstate(status),也即清除所有,然后设置status,所以clear(failbit)就表示只设置failbit,明白吗?至于清除输入流缓冲,可以使用同步方法,cin.sync()
wbj2009 2011-01-17
  • 打赏
  • 举报
回复
各位大虾,谁来给我指点迷津啊~
wbj2009 2011-01-13
  • 打赏
  • 举报
回复
我用了endl命令啊,endl可以刷新缓冲区的,flush我也试了,还是不行!TNND,这个小程序太不给力了!呵呵……
bdmh 2011-01-13
  • 打赏
  • 举报
回复
cin是有缓冲的,你可以在循环中,加一个fflush(stdin),清空缓存
昵称很不好取 2011-01-13
  • 打赏
  • 举报
回复
因为这个字母一直在缓冲区里,每次读取int时都会发现这个字母,因此死循环了

64,637

社区成员

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

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