I/O 格式控制器


如果學過 C 語言,一定對 printf 的格式指定方式感到難以忘懷,之前看過的例子中,都是使用 cout 式來輸出資訊,然而沒談到格式控制,其實只要透過幾種基本方式,也可以指定格式來輸出資訊,I/O 格式控制器是其中的一種。

I/O 格式控制器是個特殊函式,在 C++ 中常見的 endl 就是 I/O 格式控制器的一種,它會輸出換行字元並清空串流,一個 I/O 格式控制器只影響目前處理的串流。

I/O 格式控制器也可以指定參數,如果要使用具參數的 I/O 格式控制器,必須指定 iomanip 標頭檔案;先來看個基本的例子,瞭解 I/O 格式控制器的作用與使用方式:

#include <iostream> 
#include <iomanip> 
using namespace std; 

int main() {
    cout << oct << 50 << endl    // 8 進位顯示 
         << hex << 50 << endl;   // 16 進位顯示 

    // 九九乘法表 
    for(int j = 1; j < 10; j++) { 
       for(int i = 2; i < 10; i++) { 
           cout << i << "*" << j << "=" << dec << setw(2) << (i * j); 
           cout << "  "; 
       } 
       cout << endl; 
    }

    return 0; 
}

oct 控制器會將後續數字以 8 進位來顯示,hex 以 16進位顯示,而 setw 可以設定欄位寬度,然後使用 16 進位方式顯示數字,為了要輸出 10 進位的結果,在之前加入 dec 控制器。

在 C++ 中 1 可表示 true,而 0 可表示 false,輸出時也是直接輸出 0 與 1,下面這個程式使用 boolalpha 控制器,可以讓輸出以 true 與 false 來顯示:

#include <iostream> 
#include <iomanip> 
using namespace std; 

int main() { 
    bool boolnum; 

    boolnum = true; 
    cout << boolalpha << boolnum << endl; // 顯示 true

    boolnum = false; 
    cout << boolalpha << boolnum << endl; // 顯示 false

    return 0; 
}

下面列出幾個常用的I/O控制器與其說明:

  • boolalpha:讓 bool 輸出時顯示 true 與 false
  • dec:10 進位顯示
  • endl:輸出換行字元並清空串流
  • ends:輸出 Null 字元
  • fixed:以正常的數字格式顯示
  • flush:清空串流
  • hex:16 進位顯示
  • left:靠左對齊
  • oct:8 進位顯示
  • right:靠右顯示
  • scientific:科學記號表示
  • setbase(int b):指定數字基底
  • setfill(int c):指定填充字元
  • setprecision(int p):指定顯示精確度
  • setw(int w):指定欄位寬度,並以 16 進位顯示
  • showbase:顯示數字基底,例如 0x11
  • showpoint:顯示小數
  • showpos:正數顯示 + 號
  • skipws:忽略輸入的空白字元
  • upperbase:字母大寫
  • ws:忽略前導的空白字元
  • noboolalpha:關閉 boolalpha 的使用
  • noshowbase:關閉 showbase 的使用
  • noshowpoint:關閉 showpoint 的使用
  • noshowpos:關閉 showpos 的使用
  • noskipws:關閉 skipws 的使用
  • nouppercase:關閉 uppercase 的使用