c++格式化输出

  • Post author:
  • Post category:其他


有时候需要利用c++进行格式化输出,比如指定位数、不足用0补齐、按列靠右对齐等等。

一般有两种方法:

– 利用iostream对象成员函数修改格式状态值

< ios >或者< iostream >里定义了iostream类的成员函数,比如函数setf,可以设置相应的format flags,比如cout.setf(fixed)会设置cout的浮点数以定点而不是科学计数法来输出。

– 向对象中输出< iomanip >中的操作符

比如

cout<<setw(8)

设置最小输出宽度

下面根据各种功能对两种方式进行说明。



设定最小宽度

int main()  
{  
double a0=3.,a1=3.1,a2=3.14,a3=3.141,a4=3.1415,a5=3.14159,a6=3.141592;  
cout<<cout.width()<<endl;
cout.width(8);
cout<<a0<<endl;  
cout<<a0<<endl;
cout<<setw(8)<<a0<<endl;
cout<<a0<<endl;
return 0;  
}  

//输出
0
       3
3
       3
3

cout.width()返回cout的输出最小宽度值,默认为0,width(8),修改width值为8,然后下一个输出靠右对齐左边用空格补齐,第二次输入a0的时候,发现width(8)失效了,说明width值修改只影响下一次输出,并没有更改cout的格式状态值。setw()的作用是一样的,只是使用方式的区别。

只输出a0,我们还无法知道两个问题:小数点算不算是宽度,如果待输出宽度大于设定的最小宽度值怎么办

int main()  
{  
double a0=3.,a1=3.1,a2=3.14,a3=3.141,a4=3.1415,a5=3.14159,a6=3.141592;  
cout<<setfill('0')<<setw(8)<<a3<<endl;
cout<<setw(5)<<a5<<endl;
return 0;  
}  
//输出
0003.141
3.14159


set fill

设定了位数不足时用什么字符来补齐,第一个输出告诉我们,小数点也算在内,第二个输出告诉我们,width或者setw只是设定了最小宽度,当待输出宽度大于该值时,不受影响,全部输出。


控制浮点数格式


默认情况下,标准库会根据值的大小选择定点十进制还是科学计数法来输出:对于非常大的数或者非常小的数,用科学计数法来输出,否则打印为定点十进制。当然我们也可以自己设定浮点数格式,同样有两种方法。

int main()  
{  
    double a0=3.,a1=3.1,a2=3.14,a3=3.141,a4=3.1415,a5=3.14159,a6=3.141592;
    cout.setf(ios::fixed);
    cout<<a6<<endl;
    cout.setf(ios::scientific);
    cout<<a6<<endl;
} 
//输出
3.141592
0x1.921fafc8b007ap+1


设定精确度


与宽度类似,有两种方法

precision()



setprecision()

,但是精确度的理解与当前流对象的浮点输出格式有关,默认情况下,precision指的是整数部分和小数部分位数之和,使用fixed或者scientific时,指的是小数部分的位数。默认精度为6位。

当待输出浮点数精度高于设定值时,

四舍五入

而不是简单的截断。

int main()  
{  
    double a0=3.,a1=3.1,a2=3.14,a3=3.141,a4=3.1415,a5=3.14159,a6=3.141592,a7=3.141595;
    cout<<a6<<endl;  //输出3.14159,共6位,小数2舍去
    cout<<a7<<endl;  //输出3.1416 ,其实是3.14160,末尾0舍去了,5进位了
    cout.setf(ios::fixed);
    cout<<a6<<endl;//3.141592
}  

也可以用

precision()

函数来做。


其实还可以格式化输入,以后再来探讨。



版权声明:本文为wangkingkingking原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。