C++标准程序库中类 ios_base 的用法

ios_base 是C++标准程序库中的一个类,定义于头文件中。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为参数,调用登记的回调函数。

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);
}

在目录下生成ep-data.txt文件,文件中将显示自己定义的格式化设置。

  • 12
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值