Loading

c++0.7-----源码分析:iostate及badbit/failbit/eofbit/goodbit以及io文件的包含关系<原创>

代码取自GNU g++ 编译器携带的标准库,文件位置在E:\codeblock\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\bits\ios_base.h

 

文件的关系:

iostream文件: #include <ostream>

        #include <istream>

 

istream文件: #include <ios>

 

ostream文件:  #include <ios>

 

ios文件: #include <bits/ios_base.h>

可以推导出来iostream的内容一部分来自ios_base.h的内容

 

ios_base.h文件中有一段这样的定义:

 

 enum _Ios_Iostate

    {

      _S_goodbit = 0,

      _S_badbit = 1L << 0,

      _S_eofbit = 1L << 1,

      _S_failbit = 1L << 2,

      _S_ios_iostate_end = 1L << 16

    };

 

typedef _Ios_Iostate iostate;

static const iostate badbit = _S_badbit;

static const iostate eofbit = _S_eofbit;

static const iostate failbit = _S_failbit;

static const iostate goodbit = _S_goodbit;

 

可见iostream流的状态就是ios_base.h定义的4个枚举成员。

所谓的iostate类型不过就是枚举类型罢了,而四个流的条件状态就是全局静态枚举常量,因此断定四个值分别为:

badbit =1  

eofbit =2  

failbit =4  

goodbit = 0

 

验证:

if(std::cin.badbit == 1 && std::cin.eofbit == 2 && std::cin.failbit == 4 && std::cin.goodbit == 0)

  std::cout << "right" << std::endl;

 

验证结果:right

 

补充:

在c++ primer 里, 有一条语句:

auto old_state = cin.rdstate()

那iostate的类型到底是什么,经查找为:

static const std::ios_base::iostate
则上条语句等价于:
static const std::ios_base::iostate old_state = std::cin.rdstate();

 注意要在main文件加上:

#include <bits/basic_ios.h>

 

扩展:

测试badbit的影响,badbit到底有什么用?

因此,执行

std::cin.setstate(std::cin.badbit);

std::cin >> i;

后,发现控制台根本不提供用户输入

 

由于知道badbit = 1

则可否将上述代码等价于:

std::cin.setstate(1);

std::cin >> i;

不能,因为编译器没办法吧int 转换成 static const std::ios_base::iostate

此时运用static_cast方法强制转换试试:

std::cin.setstate(static_cast<const std::ios_base::iostate>(1));

std::cin >> i;

成功

 源代码:

 

 1 #include <iostream>
 2 #include <bits/basic_ios.h>
 3 
 4 int main()
 5 {
 6 
 7     int i;
 8     if(std::cin.badbit == 1 && std::cin.eofbit == 2 && std::cin.failbit == 4 && std::cin.goodbit == 0)
 9         std::cout << "right" << std::endl;
10     static const std::ios_base::iostate old_state = std::cin.rdstate();
11     std::cin.clear(static_cast<const std::ios_base::iostate>(1));
12     std::cin.clear(std::cin.badbit);
13     std::cin >> i;
14     std::cin.clear(std::cin.goodbit);
15     std::cin >> i;
16     return 0;
17 }

 

 

 

 

posted @ 2018-07-23 21:57  FishLight  阅读(1352)  评论(0编辑  收藏  举报