zoukankan      html  css  js  c++  java
  • [C++][STL]输出流(Output Stream)的格式控制

    控制C++的Stream的格式,主要有三种方法,操作flag、使用manipulator和使用stream的成员函数。

    Manipulator

    manipulator本质是一个函数,但是由于Stream类对<<做了重载,所以可以使用<<调用manipulator,看起来十分赏心悦目。

    ostream& operator << (ostream& (*op)(ostream& strm))
    {   // ostream& (*op)(ostream&) - 返回值为ostream&, 参数类型为ostream&的一个函数
    // operator << - 重载了<<运算符,并将*this当做(*op)的参数 return (*op)(*this); // 等价于 return (*op)(strm) }

     执行manipulator的时候,本来应该是这么执行的

    ostream xx = (*op)(strm);
    xx << blahblah;
    // OR
    (*op)(strm) << blahblah;
    

     现在重载了<<,可以这么做,感觉像是将(*op)输出了一样,好神奇的样子(⊙o⊙)

    strm << (*op) << blahblah;
    

    有的Manipulator有多个参数,这时要在括号里补充剩余的参数。下文列出的Manipulator,都是用于<<操作符的。

    有的Manipulator和flags重名,不要被弄糊涂了。

    Manipulator列表

    操作flags的

    • setiosflags(flags) - 设置flags,等价于strm.setf(flags)
    • resetiosflags(flags) - 重置flags,等价于strm.set(0, mask),其中mask对应flags

    直接控制格式的

    • boolalpha - 将bool变量显示为"true", "false"
    • noboolalpha - 将bool变量显示为"1", "0"

    布局相关

    • setw(val) - 等价于width(val)成员函数
    • setfill(c) - 等价于fill(c)成员函数
    • left
    • internal
    • right

    数值表示相关

    • showpos - 显示数值前边的+号
    • noshowpos - 不显示数值前边的+号
    • uppercase - 数值表示中的字母大写
    • nouppercase - 数值表示中的字母小写
    • oct - 用八进制表示数值
    • dec - 用十进制表示数值
    • hex - 用十六进制表示数值
    • showbase - 显示八进制十六进制数值的前缀
    • noshowbase - 不显示八进制十六进制数值的前缀

    浮点数相关

    • showpoint - 强制显示小数点
    • noshowpoint - 不强制显示,而不是强制不显示
    • setprecision(val) - 设置精度
    • fixed - 小数计数
    • scientific - 科学计数

    其他

    • unitbuf - 单步操作后,缓存清空
    • nounitbuf - 单步操作后,缓存不清空

    Flags

    Flags列表

    • boolalpha - 默认0 - 是否将bool变量显示为"true", "false"(也可能是其他文字,依locale而定)
    • adjustfield/left
    • adjustfield/internal - 这个不是居中对齐,符号左对齐,数值右对齐~
    • adjustfield/right
    • adjustfield/None - 调整对其方式,在width大于实际宽度时可以看出效果,默认是右对齐
    • showpos - 默认0 - 是否显示正号
    • uppercase - 默认0 - 是否显示大写,注意,是数值显示的大写,至于字符,该怎么显示仍然怎么显示

    进制相关

    • basefield/oct - octal八进制
    • basefield/dec - decimal十进制
    • basefield/hex - hexadecimal十六进制的
    • basefield/None - 数值的进制,默认是十进制
    • showbase - 默认0 - 是否显示八进制和十六进制数值的前缀

    浮点数相关

    • floatfield/base - 使用小数点
    • floatfield/scientific - 使用科学表示法
    • floatfield/None - 小数值使用小数点,大数值使用科学表示法
    • showpoint - 默认0 - 是否强制显示小数点

    其他

    • unitbuf - 默认0(但是对cerr和clog默认是1) - 每次操作后是否清空缓存

    Member Functions

    Function列表

    • width(val) - 默认0,只对下一次输出有效,只增加不缩短 - 设置下一次输出的宽度
    • fill(c) - 默认空格,只对填充有效,对'\t'和' '均无效 - 指定填充字符
    • precision(val) - 默认6 - 浮点数精度,精度外的数值采用四舍五入计算~
  • 相关阅读:
    【题解】 bzoj1191: [HNOI2006]超级英雄Hero (二分图)
    谈谈Android项目框架的前世今生
    十四个好用的开源漏洞检测工具
    关于Java导出100万行数据到Excel的优化方案
    逗号分割符--字段中含逗号等情况的解析方法Java实现
    Java日期处理
    服务器&浏览器伪装的故事
    浏览器User-agent简史(user-agent)
    修改tomcat服务器banner的方法
    life_motto
  • 原文地址:https://www.cnblogs.com/SelaSelah/p/2608490.html
Copyright © 2011-2022 走看看