Part.I Introduction
本篇博文主要整理一下 C++ 格式化输出的方式。
Part.II 输出控制
Chap.I 基础知识
关于输出流,一般有三种:cout, cerr, clog
,它们的区别如下:
cout
经过缓冲后输出,默认情况下是显示器。这是一个被缓冲的输出,是标准输出;它在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout
流插入一个endl
,不论缓冲区是否满了,都立即输出流中所有数据,然后插入一个换行符。可以被输出到文件,即可以重定向输出
。cerr
不经过缓冲而直接输出,一般用于迅速输出出错信息,是标准错误,默认情况下被关联到标准输出流,但它不被缓冲,也就说错误消息可以直接发送到显示器,而无需等到缓冲区或者新的换行符时,才被显示。clog
流也是标准错误流,作用和cerr
一样,区别在于cerr
不经过缓冲区,直接向显示器输出信息,而clog
中的信息存放在缓冲区,缓冲区满或者遇到endl
时才输出。
控制输出格式的函数有如下几个:
函数 | 含义 |
---|---|
dec |
设置整数为十进制 全局的 默认 |
hex |
设置整数为十六进制 全局的 |
oct |
设置整数为八进制 全局的 |
setbase(n) |
设置整数为n 进制(n=8,10,16 ) |
setw(14) |
设置下一个输出对象输出长度为14,对象长度不够右对齐前补空格 |
setfill('*') |
用过setw(n) 之后,长度不够前补* 全局的 |
setprecision(3) |
设置下一个输出对象精度保留小数点后3位 |
fixed |
设置浮点数以固定的小数位数显示 |
scientific |
设置浮点数以科学计数法表示 |
left |
输出左对齐 全局的 |
right |
输出右对齐 全局的 默认 |
skipws |
忽略前导空格 |
uppercase |
在以科学计数法输出E与十六进制输出X以大写输出,否则小写。 |
showpos |
输出正数时显示+ 号 |
showpoint |
强制显示小数点 |
resetiosflags() |
终止已经设置的输出格式状态,在括号中应指定内容(不懂TODO) |
注:
- 需要加头文件
#include <iomanip>
- 全局的:表示本次的设置一直延续,直到改变设置为止。
二进制输出
C++ 的 cout 可以实现直接输出八进制、十进制和十六进制数据,但是不支持直接的二进制输出,需要调用<bitset>
的库函数。下面是一个使用示例:
#include <bitset>
#include <iostream>
using namespace std;
cout << "8.25的2进制: " << bitset<64>(8.25) << endl;
// ----------- 输出如下 -----------
9 的 2 进制: 1001
// 其中 bitset<n> 中的 n 控制输出二进制的位数
ps:小数的二进制如何输出呢?
Chap.II 使用示例
保留小数点后三位
cout << fixed << setprecision(3) << 5.564854 << endl;
// ------------ output -------------
5.565
控制输出长度为 10,长度不够前补 -
,十六进制输出
cout << setw(10) << setfill('-') << hex << 56 << endl;
// ------------ output -------------
--------38
数字转字符,位数不够前补零;输出长度为 10,长度不够补*
;左对齐输出
int num = 1024; char strNum[64];
sprintf_s(strNum, 64, "%05d", num);
cout << setw(10) << setfill('*') << left << strNum << endl;
// ------------ output -------------
01024*****