标准输出函数 cout 允许用户输出各种 标准数据类型 定义的数据,但是这种输出都是按标准格式输出的。有时,用户希望能改变输出格式,比如希望以十六进制输出 100 等,此时就必须用 自定义输出格式。
在C++头文件 iomanip 中包含了许多控制符用于控制数据的输出格式。
0x10 控制符:进制转换
用于不同进制转换的控制符如下表:
控制符名称 | 产生的效果 |
---|---|
dec | 用十进制输出数据 |
hex | 用十六进制输出数据 |
oct | 用八进制输出数据 |
setbase(n) |
将基数设为 n,用 n 进制输出数据(n 的取值为 8,10,16) |
注意:
- 使用进制符输出n进制数时,默认不显示基数,若有字母则默认以小写显示。
- 使用进制符转换数据值输出后,原变量所存储的值会从转变为该进制数的值。
- 例如:
int a=30; cout<<hex<<a<<endl
; - 输出:a 的值为
0x1e
(即十六进制的1e
)
- 例如:
0x20 控制符:其他
此外,iomanip 还提供了其他控制符,如下表:
控制符名称 | 产生的效果 |
---|---|
left | 靠左对齐输出数据 |
right | 靠右对齐输出数据 |
setfill('ch') |
利用字符ch来填充空白处 |
setprecision(n) | 设置小数位数(就是定义精度) |
setw(n) |
设置显示的宽度为 n (若值宽度为 m,当 n>m 时,值自动靠右对齐,左边补空格;当 n<m 时,则按值的原长度 m 靠左输出) |
uppercase | 用大写字母显示十六进制中的字母 |
nouppercase | 取消用大写字母显示十六进制中的字母 |
showbase | 在数值前显示基数 (基数就是进制数的标志,例如八进制前的 0,十六进制前的 0x) |
noshowbase | 取消显示数值的基数 |
showpos | 在正数前面输出+号 |
skipws | 忽略输入流中的空格 |
setiosflags(n) |
设置 ios 标志,其中 n 为 ios 中枚举数据的值,如 ios::left |
resetioflags() |
取消 ios 标志 |
scientific | 用科学计数法显示浮点数 |
fixed | 用固定的小数点位数来显示浮点数 |
关于 ios::scientific
和 ios::fixed
标志,两者都是控制符 setiosflags 的参数之一:
setiosflags(ios::scientific)
用指数的方式表示实数setiosflags(ios::fixed)
以带小数点的形式表示浮点数,并且在允许的精度范围内尽可能的把数字移向小数点右侧
0x30 使用实例
给定一个整数,分别用十进制、八进制、十六进制的形式输出;再给定一个浮点数,分别采用科学计数法和小数形式输出。
源程序代码如下:
#include<iostream>
#include<iomanip>
using namespace std;
int main(void)
{
int a=30;
float f=3.1415926539798;
cout<<"用不同的进制数输出数字30:"<<endl;
cout<<"用十进制输:"<<dec<<a<<endl; //十进制显示:30。
cout<<"用八进制输出:"<<oct<<a<<endl; //八进制显示:36。
cout<<showbase; //显示数字的基数。
cout<<uppercase; //用大写字母显示十六进制的字母。
cout<<"用十六进制输出:"<<hex<<a<<endl; //十六进制显示:OX1E。
cout<<noshowbase; //取消显示数字基数。
cout<<nouppercase; //取消用大写字母显示十六进制。
cout<<setw(10)<<a<<endl; //设置宽度为10显示数字。
cout<<setfill('$')<<setw(10)<<a<<endl; //设置显示宽度为10并$填充空白处。
cout<<left<<setw(10)<<a<<endl; //左靠齐。
cout<<right<<setw(10)<<a<<endl; //右靠齐。
cout<<setprecision(6)<<scientific<<f<<endl; //用科学计数法形式输出f值,6位小数。
cout<<setprecision(5)<<fixed<<f<<endl; //用小数形式输出f值,5位小数。
system("pause"); //从程序调用pause命令,pause的功能就是在命令行输出一行类似"Press any return 0; key to exit."的字,等待用户按一个键然后返回。
}
0xF0 附:控制符的生命周期
编译器默认输入输出的整型都是十进制。
一旦改变进制形式,将保持改变后的进制模式,直至下一次的改变进制为止。
int k,m,p;
cin>> p; //默认十进制输入
cin>>hex>>k; //十六进制输入;
cin>>m; //依然是十六进制输入;
cin>>dec>>p; //恢复十进制输入
cout<<k; //默认十进制输出(不是因为前一个语句中dec的关系)
cout<<oct<<k; //八进制输出;
cout<<m; //依然是八进制输出
cout<<dec<<p; //恢复十进制输出
另外需要注意的是,输入流 cin 的进制形式 与 输出流 cout 的进制形式 互不干扰。
例如:
cin>>hex>>k; // 十六进制输入
cout<<k; // 只要这个是同一函数中第一次执行的cout,就是默认十进制输出,不受cin的hex干扰
上面的特性对 istringstream,ostringstream 和 iostringstream 所定义的变量也适用,而且在利用 istringstream,ostringstream 转换格式时,应活用此方法。