[转]C++的iostream标准库介绍(2)——输入/输出的状态标志

C++中负责的输入/输出的系统包括了关于每一个输入/输出操作的结果的记录信息。这些当前的状态信息被包含在io_state类型的对象中。io_state是一个枚举类型(就像open_mode一样),以下便是它包含的值。
goodbit 无错误
Eofbit 已到达文件尾
failbit 非致命的输入/输出错误,可挽回
badbit 致命的输入/输出错误,无法挽回
 有两种方法可以获得输入/输出的状态信息。一种方法是通过调用rdstate()函数,它将返回当前状态的错误标记。例如,假如没有任何错误,则rdstate()会返回goodbit.

#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");  
}


 

posted on 2009-07-05 16:48 碧云天 阅读(146) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

文章分类

文章档案

收藏夹

Emgu CV ——c#版的opencv

Help

搜索

最新评论

阅读排行榜

评论排行榜