C++中负责的输入/输出的系统包括了关于每一个输入/输出操作的结果的记录信息。这些当前的状态信息被包含在io_state类型的对象中。io_state是一个枚举类型(就像open_mode一样),以下便是它包含的值。
goodbit 无错误
Eofbit 已到达文件尾
failbit 非致命的输入/输出错误,可挽回
badbit 致命的输入/输出错误,无法挽回
有两种方法可以获得输入/输出的状态信息。一种方法是通过调用rdstate()函数,它将返回当前状态的错误标记。例如,假如没有任何错误,则rdstate()会返回goodbit.下例示例,表示出了rdstate()的用法: %CODE{\"cpp\"}% #include 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\"); } %ENDCODE% 另一种方法则是使用下面任何一个函数来检测相应的输入/输出状态: %CODE{\"cpp\"}% bool bad(); bool eof(); bool fail(); bool good(); %ENDCODE%
下例示例,表示出了上面各成员函数的用法: %CODE{\"cpp\"}% #include 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\"); } %ENDCODE% 如果错误发生,那么流状态既被标记为错误,你必须清除这些错误状态,以使你的程序能正确适当地继续运行。要清除错误状态,需使用clear()函数。此函数带一个参数,它是你将要设为当前状态的标志值。,只要将ios::goodbit作为实参。
示例代码如下: %CODE{\"cpp\"}% #include using namespace std;
int main() { int a; cin>>a; cout<<cin.rdstate()<<endl; cin.clear(ios::goodbit); cout<<cin.rdstate()<<endl; system(\"pause\"); } %ENDCODE% 通常当我们发现输入有错又需要改正的时候,使用clear()更改标记为正确后,同时也需要使用get()成员函数清除输入缓冲区,以达到重复输入的目的。
示例代码如下: %CODE{\"cpp\"}% #include 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\"); } %ENDCODE% 最后再给出一个对文件流错误标记处理的例子,巩固学习,代码如下: %CODE{\"cpp\"}% #include #include 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\"); } %ENDCODE%