首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 格式化輸出輸入完全指南:iomanip 與流操縱符大全

     編輯:關於C語言

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

三、浮點數精度與格式

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" (符號靠左,數字靠右)
操縱符效果前綴
dec十進制無
oct八進制0
hex十六進制0x
showbase顯示前綴-
uppercase大寫 A-F / 0X-

五、流狀態標誌底層控制

// 等價操作
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; // 讀入科學計數法浮點數

總結:核心操縱符速查表

操縱符說明
setw(n)下一個輸出最小寬度(一次性)
setfill(c)填充字符(持久)
left左對齊
right右對齊(默認)
internal符號左對齊,數值右對齊,中間填充
分類操縱符頭文件持久性
進制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 風格的格式化體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved