您的位置:首页 > 编程语言 > C语言/C++

c++格式化输出

2018-03-11 21:11 309 查看
有时候需要利用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()
{
<
4000
span class="hljs-keyword">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()
函数来做。

其实还可以格式化输入,以后再来探讨。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: