ios_base 是C++标准程序库中的一个类,定义于头文件中。ios_base类封装了C++标准中的流输入输出中不依赖于读写的数据的类型的基本信息,如格式化信息、异常状态、事件回调函数等。
C++程序设计时,一般不会直接调用std::ios_base的成员函数,但是会经常用到该类中定义的各种流的数据格式的枚举值常量。如ios_base::hex、ios_base::skipws等等。
在类std::ios_base中,保存了下述关于流的信息:
1.格式控制信息的枚举类型fmtflags ,影响到如何解释输入序列的格式、如何生成输出序列的格式,例如整数是16进制还是10进制表示,浮点数是科学计数法还是定点形式等;
2.流的状态的枚举类型iostate,如数据是否完整、是否到达流的末尾、是否读写失败等;
3.流的打开方式的枚举类型openmode,如读取、写入、追加、创建时删除原内容、二进制打开、
4.流的定位位置的枚举类型seekdir,如开始位置、当前位置、结尾位置等。
5.流的事件的枚举类型event,如“擦除”事件erase_event,改变locale设置事件imbue_event,复制格式事件copyfmt_event。
6.流的私用的其它额外保存的数据,为一个long型数组与一个指针数组。
7.一个成员类failure,用于作为C++标准中的流输入输出类库抛出的各种异常的基类。
8.一个成员类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为参数,调用登记的回调函数。
C++ Primer中的例子:
#include<iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
void file_it(ostream &os, double fo, const double fe[], int n);
const int LIMIT = 5;
int main(void){
ofstream fout;
const char*fn = "ep-data.txt";
fout.open(fn);
if (!fout.is_open()){
cout << "can't open " << fn << ".bye.\n";
exit(EXIT_FAILURE);
}
double objective;
cout << "enter the focal length of your "
"telescope objective in mm";
cin >> objective;
double eps[LIMIT];
cout << "enter the focal lengths, in mm, of " << LIMIT << " eyepieces.\n";
for (int i = 0; i < LIMIT; i++){
cout << "eyepice #" << i + 1 << ":";
cin >> eps[i];
}
file_it(fout, objective, eps, LIMIT);
file_it(cout, objective, eps, LIMIT);
cout << "done\n";
system("pause");
return 0;
}
void file_it(ostream &os, double fo, const double fe[], int n){
ios_base::fmtflags initial;
initial = os.setf(ios_base::fixed);
os.precision(0);
os << "focal length of objective:" << fo << " mm\n";
os.setf(ios::showpoint);
os.precision(1);
os.width(12);
os << "f eyepiece";
os.width(15);
os << "magnification" << endl;
for (int i = 0; i < n; i++){
os.width(12);
os << fe[i];
os.width(15);
os << int(fo / fe[i] + 0.5) << endl;
}
os.setf(initial);
}