std::cout 格式化输出简介
C++ 通常使用cout
输出数据,和printf()
函数相比,cout
实现格式化输出数据的方式更加多样化;
一方面,cout 作为 ostream
类的对象,该类中提供有一些成员方法,可实现对输出数据的格式化;另一方面,为了方面用户格式化输出数据,C++ 标准库专门提供了一个 <iomanip> 头文件,该头文件中包含有大量的格式控制符,也就是流操作算子,使用上更加方便;
cout 格式化输出有两种方法,一种是直接使用成员函数,另一种是使用流操作算子,下面分别进行介绍:
使用成员函数
cout
的基类是 ostream
类,ostream
类 中还包含一些可实现格式化输出的成员方法,这些成员方法都是从 ios
基类(以及 ios_base
类)中继承来的,cout
(以及 cerr
、clog
)也能调用:
成员函数 | 说明 |
---|---|
flags(fmtfl) | 当前的格式全部替换为fmtfl,fmtfl 可以是一种格式,也可以是多种格式 |
precision(n) | 设置输出浮点数的精度为 n |
width(w) | 指定输出宽度为 w 个字符 |
fill(c) | 在指定输出宽度的情况下,输出宽度不足用 c 填充 |
setf(fmtfl, mask) | 在当前格式的基础上,追加 fmtfl 格式,并且删除 mask 格式,其中mask参数可以省略 |
unsetf(mask) | 在当前格式的基础上,删除 mask 格式 |
对于上面函数中的 flags
函数的fmtfl
参数,setf()
函数中的 fmtfl
参数以及 unsetf()
函数可以选择下面的值:
标志 | 作用 |
---|---|
ios::boolapha | 把 true 和 false 输出为字符串 |
ios::left | 输出数据在本域宽范围内向左对齐 |
ios::right | 输出数据在本域宽范围内向右对齐 |
ios::internal | 数值的符号位在域宽内左对齐,数值右对齐,中间由填充字符填充 |
ios::dec | 设置整数的基数为 10 |
ios::oct | 设置整数的基数为 8 |
ios::hex | 设置整数的基数为 16 |
ios::showbase | 强制输出整数的基数(八进制数以 0 开头,十六进制数以 0x 打头) |
ios::showpoint | 强制输出浮点数的小点和尾数 0 |
ios::uppercase | 在以科学记数法格式 E 和以十六进制输出字母时以大写表示 |
ios::showpos | 对正数显示“+”号 |
ios::scientific | 浮点数以科学记数法格式输出 |
ios::fixed | 浮点数以定点格式(小数形式)输出 |
ios::unitbuf | 每次输出之后刷新所有的流 |
setf(fmtfl, mask)
和 unsetf(fmtfl, mask)
中的mask 参数,可以传递为下面的几个:
标志 | 作用 |
---|---|
ios::adjustfield | ios::left , ios::right , ios::internal |
ios::basefield | ios::dec ,ios::oct ,ios::hex |
ios::floatfield | ios::scientific , ios::fixed |
使用 cout
成员函数的示例程序如下:
bool testCoutUsingflags() {
{
// setf(fmt,mask) 在当前格式的基础上追加 fmt flag, 并且删除 mask 格式
std::cout.setf(std::ios::boolalpha);
bool a = true;
std::cout << "bool a:" << a << std::endl;
int m = 100;
std::cout.setf(std::ios::hex, std::ios::basefield);
std::cout << "int m:" << m << " bool a " << a << std::endl;
// 去除相应的标志
std::cout.unsetf(std::ios::boolalpha);
std::cout << "hex print int m:" << m << " bool a " << a << std::endl;
std::cout.setf(std::ios::dec, std::ios::basefield);
int n = 0x110;