曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3139|回复: 0
打印 上一主题 下一主题

rdstate() -- 检测 I/O 状态

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2011-11-30 18:55:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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);
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-19 10:18 , Processed in 0.077764 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表