4

C++ 的自定义格式输出

 2 years ago
source link: https://exp-blog.com/lang/cpp-zi-ding-yi-ge-shi-shu-chu/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

标准输出函数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 转换格式时,应活用此方法。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK