C++primer(4版)的状态流的查询与控制

xiexiufeng 2007-01-26 04:14:25
在看<<C++primer>>(4版时),测试了书上的一个例子,如下:
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); //reset the stream
continue; //get next input
}
}
return 0;
}
输入一组整数肯定时没问题了,可输入,比如:10 20 test 30;死循环,不断输出:
bad data, try again
程序的本意是通过while()循环不段读入cin,直到到达文件末尾或者发生不可恢复的读取错去为止.字符串test赋给int型ival导致istream::failbit为真,因此需重置流的状态,而continue书上说是get next input,可是通过显示bad data, try again,说明流并没有读取下一个值,还是读取的那个错值,即test!

不懂,why?谢谢大家能看看!
...全文
502 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiexiufeng 2007-01-30
  • 打赏
  • 举报
回复
真诚的谢谢楼上各位的讲解!

C++primer 中讲:s.clear(flag) 将流s中的某个指定状态设置为有效状态.flag的类型为str::iostate,而s.clear() 则是将s中的所有状态都重新设为有效状态!因此我认为参数flag是
设置前的错误的流状态,其实是错误的,s.clear(flag)是想要重新设置成的流的状态!

对于taodm(taodm)指教,我试了,cin.ignore(10000, '\n')是忽略直到换行前的所有字符,比如我输入:10 20 30 test 40 50,那么程序就会只显示:10 20 30,而忽略了40 50,我也将'\n'改为了'\40'(空格符),但还是不行,是因为cin.clear(flag)我就理解错了,将流置成failbit()状态了!

对于todototry()给的例子,我很感谢,不过我觉得有个地方改下就完美了,ignore()默认的参数是忽略一个字符,如果输入的是一个单词test,就会显示很多的:bad data, try again".改为ignore(1000, "\40")一般就可以忽略空格前的所有字符了!

To :chinesealbert(chinesealbert)
我是买的书,我是学生,有学生证打7.5折,呵呵~~

chinesealbert 2007-01-30
  • 打赏
  • 举报
回复
第四版在哪有下载的?
有中文吗?
chinesealbert 2007-01-30
  • 打赏
  • 举报
回复
mark
todototry 2007-01-29
  • 打赏
  • 举报
回复
clear函数执行两步
1。清楚现在的状态
2。设置新的状态(默认goodbit)
sdlyczl 2007-01-29
  • 打赏
  • 举报
回复
basic_ios::clear
void clear(iostate state = goodbit);
The member function replaces the stored stream state information with state | (rdbuf() != 0 ? goodbit : badbit). If state & exceptions() is nonzero, it then throws an object of class failure.
哪位老大解释一下这段话什么意思?看不懂啊
sdlyczl 2007-01-29
  • 打赏
  • 举报
回复
原来是:
cin.clear(istream::failbit); //reset the stream  改成
cin.clear(ios_base::goodbit); //reset the stream
taodm 2007-01-29
  • 打赏
  • 举报
回复
cin.clear();
cin.ignore(10000, '\n');
todototry 2007-01-29
  • 打赏
  • 举报
回复
int main()
{
int ival;
while(cin >> ival, !cin.eof())
{
if(cin.bad())
{
throw runtime_error("IO stream corrupted");
cin.clear(ios_base::goodbit);
}
if(cin.fail())
{
cerr << "bad data, try again" << endl;;
cin.clear(ios_base::goodbit); //reset the stream
cin.ignore();
continue; //get next input
}
}
return 0;
}
sdlyczl 2007-01-29
  • 打赏
  • 举报
回复
to:Top
taodm(taodm) ( ) 信誉:100 Blog
cin.clear(istream::failbit); //reset the stream
cin.ingore(10000, '\n');---->改成ignore
========================================
我试了一下,还是不行
htqx 2007-01-28
  • 打赏
  • 举报
回复
2分题.
taodm 2007-01-28
  • 打赏
  • 举报
回复
你试了没有?
xiexiufeng 2007-01-27
  • 打赏
  • 举报
回复
能解决吗,好像不能吧!偶对cin的读入机制不是很理解,希望能给出具体的解决方案,不胜感激!
taodm 2007-01-26
  • 打赏
  • 举报
回复
cin.clear(istream::failbit); //reset the stream
cin.ingore(10000, '\n');
C++ Primer中文(第5)[203M]分3个压缩包 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。 对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。 目录 第1章 开始 1   1.1 编写一个简单的C++程序 2   1.1.1 编译、运行程序 3   1.2 初识输入输出 5   1.3 注释简介 8   1.4 控制 10   1.4.1 while语句 10   1.4.2 for语句 11   1.4.3 读取数量不定的输入数据 13   1.4.4 if语句 15   1.5 类简介 17   1.5.1 Sales_item类 17   1.5.2 初识成员函数 20   1.6 书店程序 21   小结 23   术语表 23   第Ⅰ部分 C++基础 27   第2章 变量和基本类型 29   2.1 基本内置类型 30   2.1.1 算术类型 30   2.1.2 类型转换 32   2.1.3 字面值常量 35   2.2 变量 38   2.2.1 变量定义 38   2.2.2 变量声明和定义的关系 41   2.2.3 标识符 42   2.2.4 名字的作用域 43   2.3 复合类型 45   2.3.1 引用 45   2.3.2 指针 47   2.3.3 理解复合类型的声明 51   2.4 const限定符 53   2.4.1 const的引用 54   2.4.2 指针和const 56   2.4.3 顶层const 57   2.4.4 constexpr和常量表达式 58   2.5 处理类型 60   2.5.1 类型别名 60   2.5.2 auto类型说明符 61   2.5.3 decltype类型指示符 62   2.6 自定义数据结构 64   2.6.1 定义Sales_data类型 64   2.6.2 使用Sales_data类 66   2.6.3 编写自己的头文件 67   小结 69   术语表 69   第3章 字符串、向量和数组 73   3.1 命名空间的using声明 74   3.2 标准库类型string 75   3.2.1 定义和初始化string对象 76   3.2.2 string对象上的操作 77   3.2.3 处理string对象中的字符 81   3.3 标准库类型vector 86   3.3.1 定义和初始化vector对象 87   3.3.2 向vector对象中添加元素 90   3.3.3 其他vector操作 91   3.4 迭代器介绍 95   3.4.1 使用迭代器 95   3.4.2 迭代器运算 99   3.5 数组 101   3.5.1 定义和初始化内置数组 101   3.5.2 访问数组元素 103   3.5.3 指针和数组 105   3.5.4 C风格字符串 109   3.5.5 与旧代码的接口 111   3.6 多维数组 112   小结 117   术语表 117   第4章 表达式 119   4.1 基础 120   4.1.1 基本概念 120   4.1.2 优先级与结合律 121   4.1.3 求值顺序 123   4.2 算术运算符 124   4.3 逻辑和关系运算符 126   4.4 赋值运算符 129   4.5 递增和递减运算符 131   4.6 成员访问运算符 133   4.7 条件运算符 134   4.8 位运算符 135   4.9 sizeof运算符 139   4.10 逗号运算符 140   4.11 类型转换 141   4.11.1 算术转换 142   4.11.2 其他隐式类型转换 143   4.11.3 显式转换 144   4.12 运算符优先级表 147   小结 149   术语表 149   第5章 语句 153   5.1 简单语句 154   5.2 语句作用域 155   5.3 条件语句 156   5.3.1 if语句 156   5.3.2 switch语句 159   5.4 迭代语句 165   5.4.1 while语句 165   5.4.2 传统的for语句 166   5.4.3 范围for语句 168   5.4.4 do while语句 169   5.5 跳转语句 170   5.5.1 break

65,179

社区成员

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

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