文档首页> IDC服务> C++的cout格式化输出

C++的cout格式化输出

发布时间:2025-07-08 00:18       

C++ cout 格式化输出终极指南

cout 的格式化控制是 C++ I/O 的核心技能,直接影响数据呈现的精确性与可读性。本文将系统讲解流操作符、成员函数及 C++20 format 库三大方法,涵盖数字精度、对齐、进制转换等高频需求。


一、基础流操作符控制

1. 数字进制转换
#include <iostream>  
#include <iomanip>  
using namespace std;  

int num = 255;  
cout << dec << num << endl;  // 十进制 → 255  
cout << hex << num << endl;  // 十六进制 → ff  
cout << oct << num << endl;  // 八进制 → 377  

重置进制

cout << hex << num;  
cout << dec; // 必须显式切回十进制,否则后续数字全为十六进制!  
2. 浮点数精度控制
double pi = 3.1415926535;  
cout << fixed << setprecision(2) << pi << endl;  // 固定小数位 → 3.14  
cout << scientific << pi << endl;  // 科学计数法 → 3.14e+00  

⚠️ 陷阱setprecision(n) 在 fixed 模式下控制小数位,否则控制总位数

cout << setprecision(3) << 12.345;  // 输出 12.3(非fixed模式)  

二、<iomanip> 库高级格式化

1. 字段宽度与填充
cout << setw(10) << left << "ID" << setw(8) << right << 100 << endl;  
// 输出:ID__________100  (_代表空格)  
  • setw(n):设置下一个输出项的宽度(临时生效)
  • left/right/internal:左/右/符号位对齐
  • setfill(char):填充字符(默认空格)
2. 布尔值文本输出
cout << boolalpha << true << endl;  // 输出 true  
cout << noboolalpha << true;        // 恢复为 1  
3. 格式化标志位控制
标志 作用 示例
showpos 正数显示+号 +42
uppercase 十六进制字母大写 0XFF 而非 0xff
showbase 显示进制前缀 0xFF (hex)
cout << showpos << uppercase << showbase << hex << 255;  
// 输出:+0XFF  

三、C++20 std::format 现代方法

C++20 引入的 <format> 库提供更简洁的 Python 风格格式化:

#include <format>  
#include <iostream>  

double price = 99.95;  
// 类型安全、位置参数支持  
cout << format("价格: {:>10.2f} 元", price) << endl;  
// 输出:价格: ______99.95 元  

格式说明符详解

{:[填充][对齐][符号][#][0][宽度][精度][类型]}  
  • 对齐< (左)、> (右)、^ (居中)
  • 类型d (整型)、f (浮点)、x (十六进制)
  • 示例
    cout << format("{:*^10}", "HELLO");  // **HELLO***  
    cout << format("{:+05d}", 42);      // +0042  
    

四、实战场景解决方案

场景1:表格数据对齐输出
cout << left << setw(15) << "产品" << setw(8) << "价格" << endl  
     << setw(15) << "手机" << fixed << setprecision(2) << setw(8) << 5999.5 << endl  
     << setw(15) << "耳机" << setw(8) << 899.0 << endl;  

输出:

产品           价格   
手机           5999.50  
耳机           899.00  
场景2:内存地址格式化
int var;  
cout << "地址: 0x" << hex << setw(8) << setfill('0') << (long)&var;