ios_baseC++标准程式库中的一个类,定义于<ios>头文件中。ios_base类封装了C++标准中的流输入输出中不依赖于读写的数据的类型的基本信息,如格式化信息、异常状态、事件回调函数等。

C++程序设计时,一般不会直接调用std::ios_base的成员函数,但是会经常用到该类中定义的各种流的数据格式的枚举值常量。如ios_base::hex、ios_base::skipws等等。

保存的各种信息

在类std::ios_base中,保存了下述关于流的信息:

  • 格式控制信息的枚举类型fmtflags ,影响到如何解释输入序列的格式、如何生成输出序列的格式,例如整数是16进制还是10进制表示,浮点数是科学计数法还是定点形式等;
  • 流的状态的枚举类型iostate,如数据是否完整、是否到达流的末尾、是否读写失败等;
  • 流的打开方式的枚举类型openmode,如读取、写入、追加、创建时删除原内容、二进制打开、
  • 流的定位位置的枚举类型seekdir,如开始位置、当前位置、结尾位置等。
  • 流的事件的枚举类型event,如“擦除”事件erase_event,改变locale设置事件imbue_event,复制格式事件copyfmt_event。
  • 流的私用的其它额外保存的数据,为一个long型数组与一个指针数组。
  • 一个成员类failure,用于作为C++标准中的流输入输出类库抛出的各种异常的基类。
  • 一个成员类Init,用于封装cout、cin、wcout等8个静态对象的初始化函数。

成员函数

状态函数

  • ios_base::flags,读取/设置流的格式。
  • ios_base::setf,设置流的格式,与原有格式合并。
  • ios_base::unsetf,根据参数mask,清除流的格式的某些位(bit)。
  • ios_base::precision,读取/设置显示浮点数时的精度。
  • ios_base::width,读取/设定流的输出数据的显示宽度。

locale相关函数

  • ios_base::imbue,设置新的locale,并依次执行所有登记的回调函数处置imbue_event。
  • ios_base::getloc,读取当前locale设置

静态成员函数

  • ios_base::sync_with_stdio,设置流的内部标志位,确定是否与C运行时库的stdio在输入输出上同步。

私用数据存储函数

  • ios_base::xalloc,返回一个对于进程中的多线程来说是唯一的一个整形值,这个值对应于流的一个内存块的索引,该内存块可保存一个long或者指针值。
  • ios_base::iword,根据输入的索引值,返回流的一个内存块的引用,可保持一个long值。
  • ios_base::pword,根据输入的索引值,返回流的一个内存块的引用,可保持一个指针值。

回调函数

  • ios_base::register_callback,登记一个回调函数。一个流的所有回调函数的地址保存在一个单向链表中。如果某个事件发生,则以登记的逆序依次调用每个回调函数。每个回调函数内部一般有个switch语句,进入相应的事件的处理分支。

构造/析构函数

  • ios_base::ios_base
  • ios_base::~ios_base:销毁前用erase_event为参数,调用登记的回调函数。

参考文献