曲径通幽论坛

标题: rdstate() -- 检测 I/O 状态 [打印本页]

作者: beyes    时间: 2011-11-30 18:55
标题: rdstate() -- 检测 I/O 状态
C++ 的 I/O 系统保存了每次 I/O 操作结果的状态信息。I/O 流的当前状态是一个 isostate 类型的对象,其中 iostate 是在 ios 中定义的枚举类型,如:
[C++] 纯文本查看 复制代码
 enum _Ios_Iostate
    {
      _S_goodbit                = 0,
      _S_badbit                 = 1L << 0,
      _S_eofbit                 = 1L << 1,
      _S_failbit                = 1L << 2,
      _S_ios_iostate_end = 1L << 16
    };

其中,
goodbit 表示么没有错误;
eofbit 为 1 时表示遇到文件的结尾,否则为 0
failbit 为 1 时表示发生了一个严重的错误,否则为 0
badbit 为 1 时表示发生了一个严重错误,否则为 0 。

获得这些状态可以使用 ios 的成员函数 rdstate(),该函数的原型为:
iostate rdstate();
该函数返回错误标志位的当前状态,我们可以利用与操作来测试这些状态的情况。下面是测试程序:
[C++] 纯文本查看 复制代码
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
        ifstream in;
        in.open("test.txt");

        if ((in.rdstate() & ifstream::failbit) != 0)
                cerr << "Error opening 'test.txt' file.\n";

        return 0;
}

运行输出:
./rdstate
Error opening 'test.txt' file.
由于当前目录下没有 test.txt 这个文件,所以打开失败。

除了用 rdstate() 函数,还可以直接使用下面的函数单独测试:
[C++] 纯文本查看 复制代码
bool bad();
bool eof();
bool fail();
bool bad();

如果 badbit 位已设置,那么 bad() 返回真,否则为假。

如果在程序中发生了 I/O 错误,那么在程序继续运行之前需要使用 clear() 来清除错误标志位,该函数的原型如下:
void clear(iostate flags = ios::goodbit);





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2