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

    代码取自GNU g++ 编译器携带的标准库,文件位置在E:codeblockCodeBlocksMinGWlibgccmingw325.1.0includec++itsios_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 }

     

  • 相关阅读:
    npm, node, pm2 使用笔记
    没加证书的域名通过https访问,错误的访问到有证书的域名项目--已解决
    mysql数据库大表加索引
    上传大文件失败
    ifame 与父页面进行数据交互(跨域)
    windows平台编译PHP及扩展 和 踩过的坑
    vim 使用笔记
    git 在pull/push指定密钥文件
    记一次使用Xshell登陆提示所选用户密钥未在远程主机上注册
    学习网站与参考文档
  • 原文地址:https://www.cnblogs.com/yulianggo/p/9357175.html
Copyright © 2011-2022 走看看