文章目录
杂谈
在使用c++编写程序的过程中经常需要对数据和信息的输出,简单情况下cout
就可以满足需求,而在另一些情景下,则需要根据自己的需求标准化、格式化地输出。比如我之前写的分析排序算法运行时间的程序中,需要将不同规模数据的排序时间分行输出,由于涉及多行数据,在不进行格式化的情况下输出会很丑,甚至会由于结果呈现的不清晰而影响自己的判断。当你找到这篇博客的时候,一定遇到了类似的问题。
首先我们会遇到什么样的格式化输出的需求呢?我认为主要有两个方面,这里只讲这两个方面。
- 浮点数的输出,例如小数点后精确到几位数,采用科学记数法;
- 数据对齐,使得不同长度的数据在呈现的时候如同在表格中一样整齐;
一、浮点数输出
1. 保留小数点后 n n n 位
比如我想输出 3.1415926 3.1415926 3.1415926 保留小数点后4位,可以用下面的方法。
cout << fixed << setprecision(4) << 3.1415926;
这个方法可以自动四舍五入。得到的结果是 3.1416 3.1416 3.1416。
2. 使用科学计数法输出,小数点后 n n n 位
拿 314.15926 314.15926 314.15926 为例,使用下面的语句。
cout << scientific << setprecision(4) << 314.15926;
得到的结果是 3.1416 e + 002 3.1416e+002 3.1416e+002。
3. 输出有效位数 n n n 位
例如输出 3.1415926 3.1415926 3.1415926。
cout << setprecision(4) << 3.1415926;
输出结果为
3.142
3.142
3.142 。
当输出的浮点数整数位数小于要求的有效位数时,机器会自动四舍五入处理小数部分,当浮点数整数位数大于要求的有效位数时,机器则会将输出变成科学计数法。例如cout << setprecision(4) << 314159.26 << endl;
的输出结果是
3.142
e
+
005
3.142e+005
3.142e+005,而cout << setprecision(4) << 31.415926 << endl;
的输出则是
31.42
31.42
31.42。
一般来说还是直接指定小数点后保留几位或是指定采用科学记数法比较好,输出有效位数对于不同数据的输出结果格式可能是不同的,所以少用。
二、 数据对齐
1. 设置输出宽度
可以使用setw(n)
,n代表指定的宽度。例如
cout << setw(8) << 3.1415;
那么数据
3.1415
3.1415
3.1415 的输出宽度就是8。值得注意的是,setw()
不像别的输出流控制命令,它对cout
的影响是非贪婪的,即只影响下一个<<
指向的输出数据。如果要为许多数据设置固定长度,则需要手动的设置好。
2. 对齐方式
当宽度统一而数据本身的宽度并不和设定的宽度相同时,会有多余的位置空出来,那么,数据向哪边对齐呢?在设置了setw(n)
后,默认是右对齐的。我们可以用类似的方法设置其他对其方式。
cout << setw(8) << left << 3.1415;
这个语句可以设置为左对齐。使用类似的<< internal
可以将对齐设置为中对齐,但是中对齐并不是要输出的数据居中,而是用于填充的字符居中。比如
cout << setw(9) << internal << -3.14;
其输出的结果是符号 − - − 在左边而数据 3.14 3.14 3.14 在右边。那么中间填什么?或者向两边对齐时另一边填充什么?这就涉及到接下来要讲的填充。
3. 填充
对于设置宽度产生的空位,系统默认使用空格填充,如果自己想使用自定义的填充符号,则需要使用 setfill()
。比如
cout << setw(8) << setfill("*") << 3.1415;
4. 注意点
-
值得注意的是,虽然
setw()
的效果只有下次的<<
,但是诸如<< left
这样的命令是可以持久的,而不必重复设置。 -
如果觉得总是输
setw()
麻烦,不妨使用宏定义的方式,如#define coutw(n) ( cout << setw(n) )
可以简化代码。