I/O 格式控制器


如果您曾經學過 C 語言,您一定對於printf()中,使用格式指定字來指定輸出的格式感到難以忘懷,在之前我們看過的例子中,都是使用C++的預設格式來輸出資訊,事實上只要透過幾種基本的方式,我們也可以指定所需的格式來輸出資訊,I/O格式控制器即為其中的一種。

一個I/O格式控制器為一個特殊的函式,在C++中常見的endl就是I/O格式控制器的一種,它會輸出new line字元至串流中,一個I/O格式控制器只會影響目前正在處理的串流,串流處理結束後即回復C++預設的格式。

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;

boolnum = false;
cout << boolalpha << boolnum << endl;

return 0;
}

執行結果:
true
false

下面我們列出幾個常用的I/O控制器與其說明:
boolalpha 讓bool輸出時顯示true與false
dec 10進位顯示
endl  輸出new line字元
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的使用