A.3.3. 控制輸出格式
許多操縱符使我們能夠改變輸出的外觀。有兩大類的輸出控制:控制數值的表示,以及控制填充符的數量和布局。
控制布爾值和格式
改變對象格式化狀態的操縱符的一個例子是 boolalpha 操縱符。默認情況下,將 bool 值顯示為 1 或 0,true 值顯示為 1,而 false 值顯示為 0。可以通過流的 boolalpha 操縱符覆蓋這個格式化:
cout << "default bool values: " << true << " " << false << "\nalpha bool values: " << boolalpha << true << " " << false << endl;
執行時,這段程序產生下面的輸出:
default bool values: 1 0 alpha bool values: true false
一旦將 boolalpha “寫”至 cout,從這個點起就改變了 cout 將怎樣顯示 bool 值,後續顯示 bool 值的操作將用 true 或 false 進行顯示。
要取消 cout 的格式狀態改變,必須應用 noboolalpha:
bool bool_val;cout << boolalpha // sets internal state of cout << bool_val << noboolalpha; // resets internal state to default formatting
現在只改變 bool 值的格式化來顯示 bool_val,並且立即將流重置為原來的狀態。
指定整型值的基數
默認情況下,用十進制讀寫整型值。通過使用操縱符 hex、oct 和 dec,程序員可以將表示進制改為八進制、十六進制或恢復十進制(浮點值的表示不受影響):
const int ival = 15, jval = 1024; // const, so values never change cout << "default: ival = " << ival << " jval = " << jval << endl; cout << "printed in octal: ival = " << oct << ival << " jval = " << jval << endl; cout << "printed in hexadecimal: ival = " << hex << ival << " jval = " << jval << endl; cout << "printed in decimal: ival = " << dec << ival << " jval = " << jval << endl;
編譯和執行的時候,程序產生下面的輸出:
default: ival = 15 jval = 1024 printed in octal: ival = 17 jval = 2000 printed in hexadecimal: ival = f jval = 400 printed in decimal: ival = 15 jval = 1024
注意,像 boolalpha 一樣,這些操縱符改變格式狀態。它們影響緊接在後面的輸出,以及所有後續的整型輸出,直到通過調用另一操縱符重圍格式為止。
指出輸出的基數
默認情況下,顯示數值的時候,不存在關於所用基數的可見記號。例如,20 是 20,還是 16 的八進制表示?按十進制模式顯示數值的時候,會按我們期待的格式打印數值。如果需要打印八進制或十六進制值,可能應該也使用 showbase 操縱符。showbase 操縱符導致輸出流使用的約定,與指定整型常量基數所用的相同:
以 0x 為前導表示十六進制。
以 0 為前導表示八進制。
沒有任何前導表示十進制。
修改程序使用 showbase 如下:
const int ival = 15, jval = 1024; // const so values never change cout << showbase; // show base when printing integral values cout << "default: ival = " << ival << " jval = " << jval << endl; cout << "printed in octal: ival = " << oct << ival << " jval = " << jval << endl; cout << "printed in hexadecimal: ival = " << hex << ival << " jval = " << jval << endl; cout << "printed in decimal: ival = " << dec << ival << " jval = " << jval << endl; cout << noshowbase; // reset state of the stream
修改後的輸出使得基礎值到底是什麼很清楚:
default: ival = 15 jval = 1024 printed in octal: ival = 017 jval = 02000 printed in hexadecimal: ival = 0xf jval = 0x400 printed in decimal: ival = 15 jval = 1024
noshowbase 操縱符重置 cout,以便它不再顯示整型值的表示基數。
默認情況下,十六進制值用帶小寫 x 的小寫形式打印。可以應用 uppercase 操縱符顯示 X 並將十六進制數字 a - f 顯示為大寫字母。
cout << uppercase << showbase << hex << "printed in hexadecimal: ival = " << ival << " jval = " << jval << endl << nouppercase << endl;
前面的程序產生下面的輸出:
printed in hexadecimal: ival = 0XF jval = 0X400
要恢復小寫,就應用 nouppercase 操縱符。
控制浮點值的格式
對於浮點值的格式化,可以控制下面三個方面:
精度:顯示多少位數字。