加载中...

C++ 的自定义格式输出


标准输出函数cout允许用户输出各种 标准数据类型 定义的数据,但是这种输出都是按标准格式输出的。有时,用户希望能改变输出格式,比如希望以十六进制输出100等,此时就必须用 自定义输出格式

在C++头文件 iomanip 中包含了许多控制符用于控制数据的输出格式。

控制符:进制转换

用于不同进制转换的控制符如下表:

控制符名称 产生的效果
dec 用十进制输出数据
hex 用十六进制输出数据
oct 用八进制输出数据
setbase(n) 将基数设为n,用n进制输出数据(n的取值为8,10,16)

注意:
① 使用进制符输出n进制数时,默认不显示基数,若有字母则默认以小写显示。
② 使用进制符转换数据值输出后,原变量所存储的值会从转变为该进制数的值。
  例如:int a=30; cout<<hex<<a<<endl;
  输出:a的值为0x1e (即十六进制的1e)

控制符:其他

此外,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) 以带小数点的形式表示浮点数,并且在允许的精度范围内尽可能的把数字移向小数点右侧

使用实例

给定一个整数,分别用十进制、八进制、十六进制的形式输出;

再给定一个浮点数,分别采用科学计数法和小数形式输出。

源程序代码如下:

#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."的字,等待用户按一个键然后返回。
}

附:控制符的生命周期

编译器默认输入输出的整型都是十进制

一旦改变进制形式,将保持改变后的进制模式,直至下一次的改变进制为止

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 转换格式时,应活用此方法。


文章作者: EXP
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 EXP !
  目录