C++标准IO-输入状态

来源:互联网 发布:和程序员有关的网名 编辑:程序博客网 时间:2024/06/03 14:14

我们可以随意的输入输出数据了,但是我们输入的数据是否正确呢?下面我们学习下输入输出的状态标识的相关知识,C++中负责输入输出的系统包含了关于每一个输入输出操作的结果的记录信息,都被包含在了io_state类型的对象中。
io_state是一个枚举类型,包含下面的值:
goodbit        无错误
eofbit        已经到达了文件结尾
failbit        非致命的输入输出错误,可以返回
badbit        致命的输入输出错误,无法挽回
有两种方法可以获得输入输出的状态信息,一个方法是通过调用rdstate()函数,它将返回当前状态的错误标记,如果没有错误,将返回goodbit。
#include <iostream>
using namespace std;
int main(){
    int a;
    cin>>a;
    cout<<cin.rdstate()<<endl;
    if(cin.rastate==ios::goodbit)
        cout<<"ok good!"<<endl;
    else if(cin.rastate==ios_base::failbit)
        cout<<"no failed!"<<endl;
    else
        cout<<"abcdefg!"<<endl;
}

另一个方法是使用下面任何一个函数来检测相应的输入和输出状态:
bool good()
bool fail()
bool eof()
bool bad()
#incledu <iostream>
using namespace std;
int main(){
    int a;
    cin>>a;
    cout<<cin.rdstate()<<endl;
    if(cin.good())
        cout<<"ok good!"<<endl;
    if(cin.fail())
        cout<<"no fail!"<<endl;
}
如果错误发生了,那么状态标识就会被标记成相关的错误来,如果想程序能够继续正常的运行下去,必须清除错误状态,使用clear()函数即可。clear函数带一个参数,可以设置当前的标识值来,用ios::goodbit作为参数即可。
#include <iostream>
using namespace std;
int main(){
    int a;
    cin>>a;
    cout<<cin.rastate()<<endl;
    cin.clear(ios::goodbit);
    cout<<cin.rdstate()<<endl;
}
通常当我们发现输入有错又需要改正的时候,使用clear函数更正标识为正确后,还需要使用get()成员函数清除输入缓冲区,以达到重复输入的目的。
#include <iostream>
using namespace std;
int main(){
    int a;
    while(1){
        cin>>a;
        if(!cin){  //可以改成cin.fail()
            cout<<"error,input error!"<<endl;
            cin.clear();
            cin.get();
        }
        else{
            cout<<a;
            break;
        }
    }
}

下面再来个对文件流错误标记处理的例子:
#include <iostream>
#include <fstream>
using namespace std;
int main(){
    ifstream myfile("test.txt",ios_base::in,0);
    if(myfile.fail()){
        cout<<"ERROR!"<<endl;
    }
    else{
        char ch;
        while(myfile.get(ch))
            cout<<ch<<endl;
        if(myfile.eof())
            cout<<"end of the file!"<<endl;
        while(myfile.get(ch))
            cout<<ch<<endl;
    }
}

原创粉丝点击