前置说明
C++ 的输出流操作符分为两类:
- 无需额外头文件:直接包含
<iostream>即可使用(如endl、flush); - 需要
<iomanip>头文件:格式控制类操作符(如setw、setprecision),需先#include <iomanip>。
C++ 输出流操作符分为无需额外头文件的基础控制类(如 flush、ends、boolalpha、dec/oct/hex)和需包含 iomanip 的格式控制类(如 setw、setfill、setprecision、fixed/scientific)。基础操作符用于刷新缓冲区、进制转换及布尔值显示;格式操作符用于控制输出宽度、对齐方式及浮点数精度。通过组合使用这些操作符,可实现表格对齐、金额格式化等常见场景的输出需求。注意 setw 仅对下一个输出项生效,而 flush 与 endl 在性能上有差异。
C++ 的输出流操作符分为两类:
<iostream> 即可使用(如 endl、flush);<iomanip> 头文件:格式控制类操作符(如 setw、setprecision),需先 #include <iomanip>。这类操作符主要控制输出的基础行为(刷新、布尔值、进制等),是日常开发中最常用的基础工具。
endl 的'刷新'功能一致),但不插入换行符;示例:
#include <iostream>
#include <unistd.h> // Linux/macOS 暂停函数,Windows 用 #include <windows.h> + Sleep(1000)
using namespace std;
int main() {
cout << "加载中...";
cout << flush; // 立即刷新缓冲区,'加载中...'会马上显示
sleep(2); // 暂停 2 秒(模拟加载)
cout << "完成" << endl;
return 0;
}
输出效果:先显示'加载中…',暂停 2 秒后显示'完成'(无换行)。
'\'0',并刷新缓冲区;ostringstream(字符串输出流)结束字符串,或手动标记字符串结束。示例:
#include <iostream>
#include <sstream> // 字符串流头文件
using namespace std;
int main() {
ostringstream oss;
oss << "Hello" << ends << "World"; // 插入 '\\0' 分隔
cout << oss.str() << endl; // 输出:Hello('\0'后内容被截断)
return 0;
}
boolalpha:将 bool 类型输出为 true/false(文本形式);noboolalpha:恢复默认,将 bool 类型输出为 1/0(数值形式);cout 默认输出 1/0。示例:
#include <iostream>
using namespace std;
int main() {
bool flag = true;
cout << "默认格式:" << flag << endl; // 输出:1
cout << boolalpha; // 切换为文本格式
cout << "boolalpha:" << flag << endl; // 输出:true
cout << noboolalpha; // 恢复默认
cout << "恢复默认:" << !flag << endl; // 输出:0
return 0;
}
dec:十进制(默认);oct:八进制;hex:十六进制;示例:
#include <iostream>
using namespace std;
int main() {
int num = 255;
cout << "十进制:" << dec << num << endl; // 255
cout << "八进制:" << oct << num << endl; // 377(八进制表示 255)
cout << "十六进制:" << hex << num << endl; // ff(十六进制表示 255)
return 0;
}
showbase:显示进制前缀(八进制以 0 开头,十六进制以 0x 开头);noshowbase:隐藏前缀(默认);oct/hex 一起使用,让进制更易识别。示例:
#include <iostream>
using namespace std;
int main() {
int num = 255;
cout << showbase; // 显示进制前缀
cout << oct << num << endl; // 0377(八进制前缀 0)
cout << hex << num << endl; // 0xff(十六进制前缀 0x)
cout << noshowbase; // 恢复隐藏前缀
cout << hex << num << endl; // ff
return 0;
}
uppercase:十六进制字母(a-f)、科学计数法的 e 转为大写(A-F、E);nouppercase:恢复小写(默认)。示例:
#include <iostream>
using namespace std;
int main() {
int num = 255;
cout << hex << uppercase; // 十六进制 + 大写
cout << num << endl; // FF
cout << nouppercase; // 恢复小写
cout << num << endl; // ff
return 0;
}
这类操作符用于精细化控制输出格式(宽度、对齐、精度等),常用于表格输出、数值格式化等场景。
n 个字符;n,默认用空格填充;若大于 n,按实际长度输出;示例:
#include <iostream>
#include <iomanip> // 必须包含
using namespace std;
int main() {
cout << "姓名" << setw(10) << "年龄" << endl; // 年龄占 10 个字符宽度
cout << "张三" << setw(10) << 20 << endl; // 张三后补空格,年龄右对齐
cout << "李四" << setw(10) << 25 << endl;
return 0;
}
输出效果(对齐的表格):
姓名 年龄
张三 20
李四 25
left:左对齐(填充字符在右侧);right:右对齐(默认,填充字符在左侧);internal:符号(+/-)左对齐,数值右对齐(仅对带符号数值生效);setw 一起使用才生效。示例:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int num = -123;
cout << setw(8); // 宽度 8
cout << right << num << endl; // 右对齐: -123(空格在左)
cout << setw(8);
cout << left << num << endl; // 左对齐:-123 (空格在右)
cout << setw(8);
cout << internal << num << endl; // 内部对齐:- 123(符号左,数值右)
return 0;
}
setw 宽度不足时的填充字符(默认是空格);setw 生效,直到重新设置。示例:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
cout << setfill('*'); // 填充字符改为 *
cout << setw(8) << 123 << endl; // 宽度 8,右对齐:*****123
cout << left << setw(8) << 123 << endl; // 左对齐:123****
cout << setfill(' '); // 恢复默认空格填充
return 0;
}
fixed/scientific 变化:
fixed/scientific:n 表示有效数字个数(含整数和小数部分);fixed:n 表示小数位数;scientific:n 表示科学计数法的小数位数;示例:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
double pi = 3.1415926535;
// 无 fixed:有效数字 3 位
cout << setprecision(3) << pi << endl; // 3.14
// fixed:小数位 4 位
cout << fixed << setprecision(4) << pi << endl; // 3.1416
// scientific:科学计数法,小数位 2 位
cout << scientific << setprecision(2) << pi << endl; // 3.14e+00
return 0;
}
fixed:固定小数位数输出(如 3.14);scientific:科学计数法输出(如 3.14e+00);cout.unsetf(ios::fixed | ios::scientific) 取消。示例:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
double num = 1234.5678;
cout << fixed << setprecision(2) << num << endl; // 1234.57(四舍五入)
cout << scientific << setprecision(2) << num << endl; // 1.23e+03
return 0;
}
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
cout << setfill('-') << setw(30) << "-" << endl; // 分隔线
cout << setfill(' '); // 恢复空格填充
cout << left << setw(10) << "商品" << setw(10) << "单价" << setw(10) << "数量" << endl;
cout << left << setw(10) << "苹果" << fixed << setprecision(2) << setw(10) << 5.99 << setw(10) << 3 << endl;
cout << left << setw(10) << "香蕉" << setw(10) << 3.50 << setw(10) << 5 << endl;
cout << setfill('-') << setw(30) << "-" << endl;
return 0;
}
输出效果:
------------------------------
商品 单价 数量
苹果 5.99 3
香蕉 3.50 5
------------------------------
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
double money = 123456.789;
cout << "金额:¥" << fixed << setprecision(2) << money << endl; // ¥123456.79
return 0;
}
flush(仅刷新)、boolalpha(布尔文本)、hex/oct/dec(进制)是高频基础工具;setw(宽度)+left/right(对齐)用于表格,fixed+setprecision 用于浮点数精度控制;setw 仅对下一个输出项生效,setfill/boolalpha/hex 等对后续所有输出生效;\n(仅换行)而非 endl(换行 + 刷新),大量输出时差异明显。
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online