在C++程序里面经常见到下面的头文件#include <iomanip>
,其中io代表输入输出,manip是manipulator(操纵器)的缩写。
该库用来对输入输出操作的格式进行更加方便的控制,在ios_base基类的基础上将每一种格式的设置和删除都进行了函数级的同名封装,提供了全局的调用接口函数,支持在运算符“<<”和“>>”上的多次使用,配合ios_base实例的控制。是I/O流控制头文件,就像C里面的格式化输出一样。
该库提供了以下功能:
标号 | 功能和描述 |
---|---|
1 | setiosflags - 它用于设置格式标志 |
2 | resetiosflags - 用于重置格式标志 |
3 | setbase - 它用于设置basefield标志 |
4 | setfill - 它用于设置填充字符 |
5 | setprecision - 它用于设置小数精度 |
6 | setw - 它用于设置字段宽度 |
7 | get_money - 它用于获得货币值 |
8 | put_money - 它用来设置计算货币的值 |
9 | get_time - 它用于获取日期和时间 |
10 | put_time - 它用于设置日期和时间 |
控制符 | 作用 |
---|---|
oct | 设置整数为八进制 |
dec | 设置整数为十进制 |
hex | 设置整数为十六进制 |
setbase(n) | 设置整数为n进制(n=8,10,16) |
setfill© | 设置字符填充,c可以是字符常或字符变量 |
setprecision(n) | 设置浮点数的有效数字为n位 |
setw(n) | 设置字段宽度为n位 |
setiosflags(ios::fixed) | 设置浮点数以固定的小数位数显示 |
setiosflags(ios::left) | 输出左对齐 |
setiosflags(ios::right) | 输出右对齐 |
setiosflags(ios::skipws) | 忽略前导空格 |
setiosflags(ios::uppercase) | 在以科学计数法输出E与十六进制输出X以大写输出,否则小写。 |
setiosflags(ios::showpos) | 输出正数时显示"+"号 |
setiosflags(ios::showpoint) | 强制显示小数点 |
resetiosflags() | 终止已经设置的输出格式状态,在括号中应指定内容 |
下面给出几个应用:
1.小数精度
单独的setprecision(n)设置的是有效数字的位数,加上setiosflags(ios::fixed)后能够实现小数位数的保留。
#include<iostream>
#include<iomanip>
using namespace std;
int main(void)
{
cout<<0.33<<endl;
cout<<(double)10/3<<endl;
cout<<(double)1/3<<endl;
cout<<endl;
cout<<setprecision(8); //修改有效数字位数
cout<<0.33<<endl;
cout<<(double)10/3<<endl;
cout<<(double)1/3<<endl;
cout<<endl;
//设置小数位数三种写法
//第一种写法
//cout<<setiosflags(ios::fixed)<<setprecision(2);
//第二种写法
//cout.setf(ios::fixed);
//cout<<setprecision(2);
//第三种写法
cout<<fixed<<setprecision(3);
cout<<0.33<<endl;
cout<<(double)10/3<<endl;
cout<<(double)1/3<<endl;
return 0;
}
运行结果为:
0.33 //默认为6位有效数字,不够6位也不填补
3.33333
0.333333
0.33 //只使用precision,修改了有效数字的位数
3.3333333
0.33333333
0.330 //配合fixed,设置了小数位数的显示,不够填补0
3.333
0.333
2.修改进制
使用setbase或者直接(oct、dec和hex)。
#include<iostream>
#include<iomanip>
using namespace std;
int main(void)
{
cout<<17<<endl;
cout<<oct<<17<<endl; //只提供了八、十和十六进制的转换
cout<<hex<<17<<endl;
cout<<18<<endl;
cout<<endl;
cout<<setbase(8)<<17<<endl; //使用setbase(n)设置进制
cout<<setbase(16)<<17<<endl; //n=8,10,16时会转为对应的进制
cout<<setbase(3)<<17<<endl; //n=其他值时,会自动变为10进制
cout<<endl;
cout<<showbase; //使用showbase显示进制的标志
cout<<oct<<17.5<<endl; //比如八进制的0,十六进制的0x
cout<<setbase(16)<<17<<endl;
cout<<setbase(3)<<17<<endl;
return 0;
}
运行结果如下:
17
21
11
12
21
11
17
17.5
0x11
17
3.固定宽度的对齐方式和填补字符
setw(n)设置显示宽度,setfill(c)设置填充字符。
#include<iostream>
#include<iomanip>
using namespace std;
int main(void)
{
char str1[]="tian";
char str2[]="wen";
char ch='&';
cout<<str1<<str2<<endl;
cout<<setw(8)<<str1<<str2<<endl;
cout<<setw(8)<<str1<<setw(8)<<str2<<endl;
cout<<endl;
cout<<setw(8)<<setfill('*')<<str1<<endl;
cout<<setw(8)<<setfill(ch)<<str1<<endl;
cout<<endl;
//三种方式修改对齐方式
//cout.setf(ios::left);
//cout<<setiosflags(ios::left)<<setw(8)<<setfill('*')<<str1<<endl;
cout<<setw(8)<<setfill('*')<<left<<str1<<endl;
cout<<setw(8)<<setfill(ch)<<str2<<endl;
cout<<setw(8)<<setfill(' ')<<right<<100<<endl;
return 0;
}
运行结果为:
tianwen //默认为字符的长度
tianwen //setw只作用于后面的第一个要打印的对象
tian wen //setw默认为右对齐,且用空格填充
****tian //setfill既可用字符常量,也可以使用字符变量
&&&&tian
tian**** //有三种方法可以设置对齐方式
wen&&&&&
100 //也可以用来修改数字的打印方式
4.格式的恢复
从上述的三个应用来看,有些格式的作用域是只限于后面第一个打印的对象,比如setw(n)和setfill(c),其他的格式的作用域是该设置后面的打印对象,直到该格式被修改。
可以使用unsetf(cout.flags())恢复默认打印格式。
#include<iostream>
#include<iomanip>
using namespace std;
int main(void)
{
cout<<hex<<showbase;
cout<<17<<endl;
cout.unsetf(cout.flags()); //恢复默认格式
cout<<17<<endl;
return 0;
}
执行结果为:
0x11
17