关于C++的cout的格式化输出

来源:互联网 发布:ubuntu 升级python2.7 编辑:程序博客网 时间:2024/06/05 20:23

今天呢,有人问我关于一个C++浮点数输出精度的问题,毕竟到现在我也还没怎么去考量那些操作符,也就一时没答上来,查了一下,回答了那个问题,也顺便做个整理,整体的关于那些输出的manipulator。

首先是那个不太对的代码

#include <iostream>#include <iomanip>using namespace std;int main(){const double PI = 3.14;const double P = 3.3;cout.precision(20);double i = 2;cout << P << endl;cout << setprecision(6) << PI << endl;cout << 1.008 << endl;cout << i << endl;return 0;}
她后面的期望输出呢是6位有效数字,然而呢,shell只把一个3.3和另一个2输出就好了

输出:

3.29999999999999983.141.0082
为了揭示这背后只有一个的真相呢,我调用我的上课时间,关于C++的格式化输出进行了一些网络上的查找,然而,效果不好。

好不容易探明了这古怪的真相——输出流输出的时候把你最后的零吃掉了啦!!!那个可爱的setprecision(n)函数只是使后面的保证输出的有效数字不超过n罢了,真正要把零显示出还是要靠可爱的showpoint:

cout << showpoint << setprecision(6) << PI << endl;

输出:

3.29999999999999983.140001.008002.00000
这就符合要求了嘛。


顺着这个,我们继续探索一些其他的manipulator。

现在第一小组入场了,看呐,他们挥舞着手中的小彩旗,尽显年轻风采,斗志…(啪)

第一小组操作符作用endscout<<ends等价于cout<<'\0',输出串结束标志(喵喵喵?)flush清空输出流endl换行并flush,嗯,等价于cout << '\n' << flush
首先是ends

cout << showpoint << setprecision(6) << PI << ends << 2.1 << '\0' << 2.1 << 2.1;
输出:
3.14000 2.10000 2.100002.10000
可以看出,嗯多了一个空格,嗯,好吧,cpp reference上就比我的参考书写的明白多了:Inserts a null character.

本来也想搞个flush的例子的,但,根本没……,暂时想不到什么把东西塞进流不让他输出然后清空他的办法

endl太常用,算了。


接下来进场的是第二小组!它们有着神奇的化身,他们一位两体!(啪)

第二小组流成员函数对应控制符特效precision(int)setprecision(int)设置浮点数十进制精度值width(int)setw(int)设置字段宽度(仅下一个输出)fill(char)setfill(char)设置填充字符setf(int)setiosflags(int)设置格式标志(后面会提到各类格式表示)unsetf(int)resetiosflags(int)取消某格式标志的设置

precision在最初已经用过了,下面几个让我们依次玩一玩。

const double PI = 3.14;const double P = 3.3;double i = 2;cout.width(6);cout << PI << endl;
cout << setw(8) << P << endl;cout << setfill('*') << setw(7) << i << endl;
输出为:
  3.14     3.32******2
很可爱吧!默认占位符为空,并且setw是只能应用到下一个输出的,然后数一数输出的空和数字小数点,加起来一共就是6个,8个,7个字符了呢。

cout << setiosflags(ios::left) << setw(10) << PI << endl;cout << resetiosflags(ios::left) << setw(10) << PI << endl;
输出为
3.14************3.14
看!占位符到后面了,这里就用了一个格式标志ios::left,一取消,又到前面了,格式标志后面会介绍的


第三小组!!标识符(其实也几乎全是格式标志,只要前面加个ios::)特效(duangduangduang)boolalpha / noboolalpha将之后的布尔类型值输出为true/falseshowbase / noshowbase强制输出整数的基数showpoint / noshowpoint强制输出省略的零和小数点showpos / noshowpos强制输出+unitbuf / nounitbuf每次输出后自动flushuppercase / nouppercase输出十六进制时,ABCDEF大写dec / hex / oct强行改整数输出进制fixed / scientific / hexfloat / defaultfloat强行输出为:定点小数,科学记数法,十六进制浮点数,默认浮点数输出格式left/right/internal(补一行)你知道的啦,左对齐右对齐什么的,最后那个是符号左对齐,数字右对齐游戏开始!

bool tru = true, fals = false;cout << boolalpha << tru  << 1 << endl << fals << endl;
输出
true1false
代码:
cout << hex << 13 << endl << showbase << 13 << endl << oct << 143 << endl;
输出:
d0xd0217
代码:
cout << setprecision(9) << PI << endl;cout << showpoint << PI << endl;cout << i << endl;cout << noshowpoint << PI << endl;cout << i << endl;
输出
3.143.140000002.000000003.142
代码:
cout << PI << endl;cout << showpos << PI << endl;cout << 1.008 << endl;
输出:

3.14+3.14+1.008

最后测一下fixed什么的
cout << fixed << PI << endl;cout << scientific << PI << defaultfloat << endl;cout << hexfloat << PI << endl;
输出:
3.1400003.140000e+0000x1.91eb85p+1
喵喵喵?那个浮点十六进制数我看不懂你啊。


OK,就这样吧,也挺全了,应该吧

原创粉丝点击