〈I/O 格式控制器〉可以對當時處理中的串流改變格式,如果想在程式進行過程中,始終維持指定的格式,可以使用格式旗標,透過 setf 與 unsetf 方法來設定與取消。
以下列出一些常用的格式旗標:
ios::boolalpha: 將真與假以 true 與 false 顯示ios::dec:10 進位顯示ios::fixed:正常方式顯示(非科學記號)ios::hex:16 進位顯示ios::left:靠左ios::oct:8 進位顯示ios::scientific:科學記號ios::showbase:顯示基底ios::showpoint:顯示小數點ios::showpos:正數顯示 +ios::skipws:忽略空白字元ios::uppercase:字母大寫
可以一次設定一個格式旗標,若要設定多個格式旗標,可以使用 | 來連結,例如:
cout.setf(ios::showbase | ios::hex);
下面這個程式顯示一些基本的格式旗標作用:
#include <iostream>
using namespace std;
int main() {
cout.unsetf(ios::dec); // 取消 10 進位顯示
cout.setf(ios::hex | ios::scientific); // 16 進位顯示或科學記號顯示
cout << 12345 << " " << 100 << endl;
cout.setf(ios::showpos | ios::showpoint); // 正數顯示 + 號且顯示小數點
cout << 10.0 << ": " << -10.0 << endl;
return 0;
}
執行結果:
3039 64
+1.000000e+01: -1.000000e+01
在程式中先解除了 ios::dec 格式旗標,這個動作並不一定需要,但在某些編譯器中,這個旗標會覆蓋其它的旗標,先清除比較保險。
ios 類別的 flags 方法會傳回目前串流的格式設定,如果傳遞參數給它,會設定指定的格式,並傳回上一個格式設定:
fmtflags flags();
fmtflags flags(fmtflags);
想一次設定指定的格式旗標,可以如下:
ios::fmtflags f = ios::showpos | ios::showbase | ios::oct | ios::right;
cout.flags(f);
下面這個程式可以用來測試串流的格式設定:
#include <iostream>
using namespace std;
void info(ios::fmtflags current, const ios::fmtflags &flag, const string &flagName) {
if(current & flag) {
cout << flagName << " on" << endl;
}
else {
cout << flagName << " off" << endl;
}
}
int main() {
cout.unsetf(ios::dec);
cout.setf(ios::oct | ios::showbase);
ios::fmtflags flags = cout.flags();
info(flags, ios::left, "left");
info(flags, ios::dec, "dec");
info(flags, ios::showbase, "showbase");
info(flags, ios::oct, "oct");
return 0;
}
執行結果:
left off
dec off
showbase on
oct on

