C++ I/O 流提供了強大的格式化控制機制,通過操縱符與流狀態標誌實現類型安全、可擴展的格式化輸出。本文系統梳理布爾值、整數進制、浮點精度、填充對齊四大核心場景。
一、布爾值格式化:boolalpha / noboolalpha
cout << "default: " << true << " " << false << "\n"; // 1 0
cout << boolalpha << "alpha: " << true << " " << false; // true false
cout << noboolalpha; // 恢復默認
- 狀態持久:一次設定影響後續所有
bool 輸出
- 輸入端對應:
cin >> boolalpha 可解析 "true"/"false"
二、整數進制控制:dec / oct / hex + showbase
const int ival = 15, jval = 1024;
cout << "dec: " << dec << ival << " " << jval << "\n"; // 15 1024
cout << "oct: " << oct << ival << " " << jval << "\n"; // 17 2000
cout << "hex: " << hex << ival << " " << jval << "\n"; // f 400
cout << showbase << hex << ival << " " << jval << "\n"; // 0xf 0x400
cout << nouppercase << uppercase << ival << " " << jval; // 0XF 0X400
| 操縱符 | 效果 | 前綴 |
dec | 十進制 | 無 |
oct | 八進制 | 0 |
hex | 十六進制 | 0x |
showbase | 顯示前綴 | - |
uppercase | 大寫 A-F / 0X | - |
三、浮點數精度與格式
double pi = 3.1415926535;
cout << "default: " << pi << "\n"; // 3.14159
cout << "precision(3): " << setprecision(3) << pi; // 3.14 (有效位數3)
cout << fixed << setprecision(2) << pi; // 3.14 (小數點後2位)
cout << scientific << setprecision(3) << pi; // 3.142e+00
setprecision(n):默認控制有效數字總數;配合 fixed 控制小數位數;配合 scientific 控制指數部分有效位數
fixed:定點表示法(不使用科學計數法)
scientific:科學計數法
hexfloat (C++11):十六進制浮點表示
四、寬度、填充、對齊
#include
cout << setw(10) << setfill('*') << left << 42; // "42********"
cout << right << setw(10) << 42; // "********42"
cout << internal << showpos << setw(10) << -42; // "-*******42" (符號靠左,數字靠右)
| 操縱符 | 說明 |
setw(n) | 下一個輸出最小寬度(一次性) |
setfill(c) | 填充字符(持久) |
left | 左對齊 |
right | 右對齊(默認) |
internal | 符號左對齊,數值右對齊,中間填充 |
五、流狀態標誌底層控制
// 等價操作
cout.setf(ios::hex, ios::basefield); // 設置進制
cout.unsetf(ios::floatfield); // 清除浮點格式
cout.flags(); // 獲取所有格式標誌
cout.flags(ios::hex | ios::showbase); // 批量設置
六、自定義類型格式化
struct Date { int y, m, d; };
ostream& operator<<(ostream& os, const Date& dt) {
ios::fmtflags f = os.flags(); // 保存原格式
os << setw(4) << setfill('0') << dt.y << '-'
<< setw(2) << dt.m << '-'
<< setw(2) << dt.d;
os.flags(f); // 恢復
return os;
}
七、輸入格式化
int x;
cin >> hex >> x; // 讀入十六進制整數
cin >> boolalpha >> x; // 讀入 true/false 為 bool
double d;
cin >> scientific >> d; // 讀入科學計數法浮點數
總結:核心操縱符速查表
| 分類 | 操縱符 | 頭文件 | 持久性 |
| 進制 | dec, oct, hex | <iostream> | 持久 |
| showbase, noshowbase |
| uppercase, nouppercase |
| boolalpha, noboolalpha |
| 浮點 | fixed, scientific, hexfloat, defaultfloat | 持久 |
| setprecision(n) | <iomanip> | 持久 |
| 寬度/填充 | setw(n) | <iomanip> | 一次性 |
| setfill(c) | <iomanip> | 持久 |
| left, right, internal | <iomanip> | 持久 |
| showpos, noshowpos | <iomanip> | 持久 |
核心原則: 操縱符修改流對象內部格式狀態,具有傳遞性。善用 flags() 保存/恢復,避免副作用污染後續輸出。現代 C++ (C++20) 推薦使用 std::format 獲得類型安全、Python 風格的格式化體驗。
- 上一篇文章: Oracle Pro*C/C++ 多線程數據導出程序實戰:上下文隔離與游標預取優化
- 下一篇文章: VC 編譯鏈接深度解析:運行時庫、子系統、入口點與默認庫衝突全攻略
Copyright ©
程式碼之家 All Rights Reserved