cin读入失败的异常处理
来源:互联网 发布:seo站长工具查询 编辑:程序博客网 时间:2024/05/29 17:01
先来看这篇文章:
cin读取失败后进入死循环?-------剖析输入流的条件
考虑如下代码:
#include <iostream>using namespace std;int main(){ int a; while(cout<<"input a integer (1- 10) :",cin>>a,! (a>=1 && a<=10)) cout<<"try again!"<<endl;return 0;}
本意是让用户选择一个1-10的数,如果不是1-10的数则重新输入。
分析:
如果用户输入了一个不在1-10的 int,那么,程序会正确的执行,并且提示用户重新输入。
但是如果用户错误的输入了一个字符char,那么,后果就是一直执行while循环!
错误分析:
当cin尝试将输入的字符读为int型数据失败后,会产生一个错误状态--cin.fail().而要用cin读取输入流中的数据,输入流必须处于无错误状态。因此,由于错误状态的存在,会一直执行while循环。
错误修正:
#include <iostream>using namespace std;int main(){int a;while(cout<<"input a integer (1-10) :",cin>>a,! (a>=1 && a<=10) || cin.fail()){ cout<<"try again!"<<endl; cin.clear(); //清除std::cin的错误状态 cin.sync(); //清空输入缓冲区}return 0;}
加上判断输入是否成功的cin.fail()以及修正错误输入的cin.clear()和cin.sync();
其中std::cin.sync();这一句必不可少,因为所有从标准输入设备输入的数据都是先保存在缓冲区中,然后istream对象再从缓冲区中进行提取。如果不清空缓存,下次在读取数据的时候又会再次产生错误,也会陷入死循环。
嗯。。。下面写的是我写的一个异常处理:
#include <iostream>#include <cstdio>using namespace std;int main(){ int n; while(1) { cin>>n; if(cin.fail()) { cout<<"try again"<<endl; cin.clear();//清除cin.fail()这个错误状态 cin.sync();//清除缓冲区 //或者用这个_flushall();头文件<cstdio> } else cout<<"successful"<<endl; } return 0;}
- cin读入失败的异常处理
- cin的错误处理
- 有关cin异常的解决办法
- C++中的cin函数和异常的来源(failbit)与处理(clear)
- 对“键盘读入”的处理
- 循环cin读入如何终止
- cin深入分析(下) - cin的错误处理【转载】【补充】
- cin深入分析(下) - cin的错误处理(转)
- cin深入分析(下) – cin的错误处理
- C++中的string的读入流对cin与getline的选择
- 标准输入cin的返回值以及读入未知数目数据的问题
- cin.get()处理输入的问题
- cin标准输入流的错误处理
- c++中关于字符串的读入——cin、getline、get、gtes(查询+思考+总结)
- CodeForces 471D<差分+KMP>--scanf的读入远比cin快
- 各种输出读入(尽量用cin/cout)
- 读入——getline()函数和cin
- Linux下OpenCV中cvCreateFileCapture读入视频失败的解决
- UVa 400 Unix ls (字符串排序&规格化输出)
- RMAN差异增量和累积增量
- 黑马程序员-------踏踏实实WINFORM基础(二)
- 位图(BMP)文件头格式及数据分析
- 我的第一片博客
- cin读入失败的异常处理
- FlexPaper+SWFTools 实现仿百度文库及一些小问题
- spi与i2c
- FlexPaper实现文档在线浏览(附源码)
- C/C++中判断某一文件或目录是否存在
- ios高效开发二--ARC跟block那点事
- JDK 7 环境配置 windows7_X64系统
- 文档在线预览方案
- C语言的那些事——函数部分(1)