代码取自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 }