输入/输出的状态标志

的相关知识,C++中负责的输入/输出的系统包括了关于每一个输入/输出操作的结果的记录信息。这些当前的状态信息被包含在io_state类型的对象中。io_state是一个枚举类型(就像open_mode一样),以下便是它包含的值。

goodbit 无错误

Eofbit 已到达文件尾

failbit 非致命的输入/输出错误,可挽回

badbit 致命的输入/输出错误,无法挽回

有两种方法可以获得输入/输出的状态信息。一种方法是通过调用rdstate()函数,它将返回当前状态的错误标记。例如,假如没有任何错误,则rdstate()会返回goodbit.

  下例示例,表示出了rdstate()的用法:

 #include <iostream
using namespace std; 
 
int main()  

    int a; 
    cin>>a; 
    cout<<cin.rdstate()<<endl; 
    if(cin.rdstate() == ios::goodbit) 
    { 
        cout<<"输入数据的类型正确,无错误!"<<endl; 
    } 
    if(cin.rdstate() == ios_base::failbit) 
    { 
        cout<<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"<<endl; 
    } 
    system("pause"); 
}

  另一种方法则是使用下面任何一个函数来检测相应的输入/输出状态:

bool bad();

bool eof();

bool fail();

bool good();

  下例示例,表示出了上面各成员函数的用法:

  
#include <iostream
using namespace std; 
 
int main()  

    int a; 
    cin>>a; 
    cout<<cin.rdstate()<<endl; 
    if(cin.good()) 
    { 
        cout<<"输入数据的类型正确,无错误!"<<endl; 
    } 
    if(cin.fail()) 
    { 
        cout<<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"<<endl; 
    } 
    system("pause"); 
}

  如果错误发生,那么流状态既被标记为错误,你必须清除这些错误状态,以使你的程序能正确适当地继续运行。要清除错误状态,需使用clear()函数。此函数带一个参数,它是你将要设为当前状态的标志值。,只要将ios::goodbit作为实参。

  示例代码如下:

  
 
#include <iostream
using namespace std; 
 
int main()  

    int a; 
    cin>>a; 
    cout<<cin.rdstate()<<endl; 
    cin.clear(ios::goodbit); 
    cout<<cin.rdstate()<<endl; 
    system("pause"); 
}

常当我们发现输入有错又需要改正的时候,使用clear()更改标记为正确后,同时也需要使用get()成员函数清除输入缓冲区,以达到重复输入的目的。

  示例代码如下:

 #include <iostream
using namespace std; 
 
int main()  

    int a; 
    while(1) 
    { 
        cin>>a; 
        if(!cin)//条件可改写为cin.fail() 
        { 
            cout<<"输入有错!请重新输入"<<endl; 
            cin.clear(); 
            cin.get(); 
        } 
        else 
        { 
            cout<<a; 
            break
        } 
    } 
    system("pause"); 
}

  最后再给出一个对文件流错误标记处理的例子  ,代码如下:

 #include <iostream
#include <fstream
using namespace std; 
 
int main()  

    ifstream myfile("c://1.txt",ios_base::in,0); 
    if(myfile.fail()) 
    { 
        cout<<"文件读取失败或指定文件不存在!"<<endl; 
    } 
    else 
    { 
        char ch; 
        while(myfile.get(ch)) 
        { 
            cout<<ch; 
        } 
        if(myfile.eof()) 
        { 
            cout<<"文件内容已经全部读完"<<endl; 
        } 
        while(myfile.get(ch)) 
        { 
            cout<<ch; 
        } 
    } 
    system("pause"); 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值