控制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 - 浮点数精度,精度外的数值采用四舍五入计算~