cin标准输入流的错误处理
来源:互联网 发布:老徐杂货铺淘宝 编辑:程序博客网 时间:2024/04/30 08:17
首先这个知识我是在《C++ primer plus》第六版这本书上了解到的,在第六章的187页开始,对于cin标准输入流检测到用户输入了错误内容时,一般情况下应采取以下三个步骤一一进行:
1.重置cin以接受新的输入。
2.删除错误输入。
3.提示用户再输入。
第一步重置cin以接受新的输入是要最先做的,一般用成员函数clear();形式为cin.clear();如果省略这条语句,程序将拒绝继续读取输入。cin.clear()是用来更改cin的状态标示符的。通俗的讲就是将一个出错的“流”恢复为“好”,并设置goodbit状态位。
cin输入流的机制是:
当遇到无效字符或遇到文件结束符(不是换行符,是文件中的数据已读完)时,输入流cin就处于出错状态,即无法正常提取数据。此时对cin流的所有提取操作将终止。在 IBM PC及其兼容机中,以Ctrl + Z表示文件结束符。在UNIX和Macintosh系统中,以 Ctrl + D表示文件结束符。当输入流cin处于出错状态时,如果测试cin的值,可以发现它的值为false(假),即cin为0值。如果输入流在正常状态,cin的值为true(真),即cin为 一个非0值。可以通过测试cin的值,判断流对象是否处于正常状态和提取操作是否成功。如:
if(!cn) //if表达式判断为真时cin输入流处于出错状态,无法正常提取数据
cout<<"error";
实例程序:
//cin表达式输出错误类型的解决办法
#include<iostream>const int Asize = 5;int main(){ using namespace std; int golf[Asize]; int i,sum = 0; float ave; for(i = 0;i < Asize;i++) { cout << "round # " << i + 1; while(!(cin >> golf[i])) { cin.clear(); while(cin.get() != '\n') { continue; } cout << "Please enter a number:"; } } for(i = 0;i < Asize;i++) { sum = sum + golf[i]; } ave = (float)sum / Asize; cout << ave << endl; return 0;}
程序运行结果如下图所示:
while(!(cin >> golf[i])){ cin.clear(); while(cin.get() != '\n') { continue; } cout << "Please enter a number:";}首先代码块的外部是一个大的while循环,先是判断括号中的表达式
cin >> golf[i]
倘若cin输入流读取正常,则cin输入流返回bool值true,这样的话!true则为false,所以在正常输入流读取的情况下,是不会进入错误处理的代码块内部的,读取正常的情况下,每个读取的值一一存储在整型数组中,而当用户输入不当的内容时,输入流读取错误从而返回false,所以外部while循环为真而进入代码块内部,从而开始进行一开始的“三部曲”。cin.clear();使输入流恢复正常后,然后接着内部while循环,是用cin.get()成员函数一个个的读取输入的错误内容,直到最后输入的回车符,错误内容读取完毕,再提示用户应该输入的类型。图示如下:
↓
dsads(Enter回车) 一开始输入流cin读取到第一个字符时,检测到输入错误
cin输入流恢复正常后,cin.get()成员函数再一一读取错误字符
↓
dsads(Enter回车) 从当前位置开始,一一读取过去
↓
dsads(Enter回车) 直到回车符结束,由于只是读取没有保存,所以就相当于是删除了这些错误内容
cout <<"Please enter a number:";
然后再提示用户输入正确内容存储到整型数组中。
新手C++入门,如有错误还请指正,谢谢。- cin标准输入流的错误处理
- cin标准输入流错误处理
- cin标准输入流错误清理
- cin标准输入流错误清理
- cin输入错误处理
- cin的错误处理
- 标准输入的原理:cin与scanf
- C++中cin输入错误的解决办法
- cin.get()处理输入的问题
- 读取数字的循环,用cin表达式的值判断错误输入并清除cin流接受新的输入
- cin深入分析(下) - cin的错误处理【转载】【补充】
- cin深入分析(下) - cin的错误处理(转)
- cin深入分析(下) – cin的错误处理
- cin输入操作处理
- std::cin.getline()输入缓冲区溢出错误处理
- 输入流cin的状态
- C++ 标准输入 cin 使用
- 标准输入流中空白字符的怪异 —— 区分 scanf 与 cin
- PLSQL导出CSV文件中文存在乱码
- 发送http请求获取响应
- Android支持的媒体格式 .
- Leetcode143: Convert Sorted List to Binary Search Tree
- dp 数塔
- cin标准输入流的错误处理
- redis集群实战
- Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
- 在 Ubuntu 14.04 LTS 上挂载天翼云
- vc++各种文件的作用
- 《浪潮之巅》 插画
- 内存管理器(十二)kernel内存管理----kmalloc/kfree
- Nand分区及nand erase简解
- 设计模式 一一一 策略模式