cin标准输入流的错误处理

首先这个知识我是在《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()成员函数一个个的读取输入的错误内容,直到最后输入的回车符,错误内容读取完毕,再提示用户应该输入的类型。
图示如下:

dsadsEnter回车) 一开始输入流cin读取到第一个字符时,检测到输入错误

                                                 cin输入流恢复正常后,cin.get()成员函数再一一读取错误字符

 

dsadsEnter回车)  从当前位置开始,一一读取过去

 

          

dsadsEnter回车)  直到回车符结束,由于只是读取没有保存,所以就相当于是删除了这些错误内容

cout <<"Please enter a number:";

然后再提示用户输入正确内容存储到整型数组中。

新手C++入门,如有错误还请指正,谢谢。


你可能感兴趣的:(C++,cin输入流问题)