using fmtflags = T1;
T1
は処理系定義の型。
概要
fmtflags
はロケールに依存しないストリームの書式に関するフラグを保持するためのビットマスク型である。
fmtflags
には以下の表のようなビットマスク値が存在し、全て ios_base
の静的メンバ定数として定義されている。
定数 | 設定された場合の効果 |
---|---|
boolalpha |
bool 型の入出力をアルファベット形式(true 、false )で行う。 |
dec |
整数の入出力を 10 進数で行う。 |
fixed |
浮動小数点数の出力を固定表記(12.345670 のような形式)で行う。 |
hex |
整数の入出力を 16 進数で行う。 |
internal |
中央揃え。埋め文字を出力の内側に追加する。出力の内側に追加する適切な場所が無ければ right と等価。 |
left |
左寄せ。埋め文字を出力の右側に追加する。 |
oct |
整数の入出力を 8 進数で行う。 |
right |
右寄せ。埋め文字を出力の左側に追加する。 |
scientific |
浮動小数点数の出力を科学表記(1.234567e+01 のような形式)で行う。 |
showbase |
整数の出力時に先頭に基数を表す出力(8 進数だと 0 、16 進数だと 0x )を追加する。 |
showpoint |
浮動小数点数の出力時に必ず小数点を出力する。 |
showpos |
負でない数値の出力時に + 符号を出力する。 |
skipws |
特定の入力処理の際に、先行する空白文字をスキップする。 |
unitbuf |
各出力処理の後、毎回バッファをフラッシュする。 |
uppercase |
特定の小文字の出力を大文字の出力にする。(scientific の E や hex | showbase の 0X など) |
また、上記に加えて、setf()
の第 2 引数や unsetf()
の引数に使用するため、 以下のように組み合わせた定数も ios_base
の静的メンバ定数として定義されている。
定数 | 値 |
---|---|
adjustfield |
left | right | internal |
basefield |
dec | oct | hex |
floatfield |
scientific | fixed |
さらに、直接の定数は存在しないが、C++11 からは fixed | scientific
の組み合わせで 16 進浮動小数点出力を行う。
(16 進浮動小数点出力が、より直観的な hex
との組み合わせを使用しないのは、C++03 までとの互換性のため)
備考
通常はこれらのフラグを直接使用することはあまり無く、対応するマニピュレータを使用することが一般的である。
例 boolalpha
#include <iostream>
int main()
{
std::cout.setf(std::ios_base::boolalpha); // std::boolalpha マニピュレータと等価
std::cout << true << ", " << false << "\n";
std::cout.unsetf(std::ios_base::boolalpha); // std::noboolalpha マニピュレータと等価
std::cout << true << ", " << false << "\n";
}
出力
true, false
1, 0
例 showpos
#include <iostream>
int main()
{
std::cout.setf(std::ios_base::showpos); // std::showpos マニピュレータと等価
std::cout << 10 << '\n';
std::cout.unsetf(std::ios_base::showpos); // std::noshowpos マニピュレータと等価
std::cout << 10 << "\n";
}
出力
+10
10
例 showpoint
#include <iostream>
int main()
{
std::cout.setf(std::ios_base::showpoint); // std::showpoint マニピュレータと等価
std::cout << 10.0 << '\n';
std::cout.unsetf(std::ios_base::showpoint); // std::noshowpoint マニピュレータと等価
std::cout << 10.0 << "\n";
}
出力
10.0000
10
例 整数の基数指定
#include <iostream>
int main()
{
std::cout.setf(std::ios_base::showbase); // std::showbase マニピュレータと等価
std::cout.setf(std::ios_base::hex, std::ios_base::basefield); // std::hex マニピュレータと等価
std::cout << 10 << '\n';
std::cout.setf(std::ios_base::oct, std::ios_base::basefield); // std::oct マニピュレータと等価
std::cout << 10 << '\n';
std::cout.setf(std::ios_base::dec, std::ios_base::basefield); // std::dec マニピュレータと等価
std::cout << 10 << "\n\n";
std::cout.unsetf(std::ios_base::showbase); // std::noshowbase マニピュレータと等価
std::cout.setf(std::ios_base::hex, std::ios_base::basefield); // std::hex マニピュレータと等価
std::cout << 10 << '\n';
std::cout.setf(std::ios_base::oct, std::ios_base::basefield); // std::oct マニピュレータと等価
std::cout << 10 << '\n';
std::cout.setf(std::ios_base::dec, std::ios_base::basefield); // std::dec マニピュレータと等価
std::cout << 10 << "\n";
}
出力
0xa
012
10
a
12
10
例 浮動小数点数のフォーマット
#include <iostream>
int main()
{
std::cout.setf(std::ios_base::uppercase); // std::uppercase マニピュレータと等価
std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield); // std::fixed マニピュレータと等価
std::cout << 12.34567 << '\n';
std::cout.setf(std::ios_base::scientific, std::ios_base::floatfield); // std::fixed マニピュレータと等価
std::cout << 12.34567 << '\n';
std::cout.setf(std::ios_base::fixed | std::ios_base::scientific, std::ios_base::floatfield); // C++11 から
// std::hexfloat マニピュレータと等価
std::cout << 12.34567 << '\n';
std::cout.unsetf(std::ios_base::floatfield); // std::defaultfloat マニピュレータと等価
std::cout << 12.34567 << "\n\n";
std::cout.unsetf(std::ios_base::uppercase); // std::nouppercase マニピュレータと等価
std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield); // std::fixed マニピュレータと等価
std::cout << 12.34567 << '\n';
std::cout.setf(std::ios_base::scientific, std::ios_base::floatfield); // std::scientific マニピュレータと等価
std::cout << 12.34567 << '\n';
std::cout.setf(std::ios_base::fixed | std::ios_base::scientific, std::ios_base::floatfield); // C++11 から
// std::hexfloat マニピュレータと等価
std::cout << 12.34567 << '\n';
std::cout.unsetf(std::ios_base::floatfield); // std::defaultfloat マニピュレータと等価
std::cout << 12.34567 << "\n\n";
}
出力
12.345670
1.234567E+01
0X1.8B0FBA8826AA9P+3
12.3457
12.345670
1.234567e+01
0x1.8b0fba8826aa9p+3
12.3457
#include <iostream>
int main()
{
std::cout.width(10);
std::cout.setf(std::ios_base::right, std::ios_base::adjustfield); // std::right マニピュレータと等価
std::cout << -10 << "|\n";
std::cout.width(10);
std::cout.setf(std::ios_base::internal, std::ios_base::adjustfield); // std::internal マニピュレータと等価
std::cout << -10 << "|\n";
std::cout.width(10);
std::cout.setf(std::ios_base::left, std::ios_base::adjustfield); // std::left マニピュレータと等価
std::cout << -10 << "|\n";
}
出力
-10|
- 10|
-10 |
バージョン
言語
- C++98
- C++11(
fixed | scientific
による 16 進浮動小数点出力のみ)
処理系
- Clang: 3.0, 3.1, 3.2, 3.3, 3.4, 3.5.0, 3.6.0, 3.7.0, 3.8.0
- GCC: 4.3.6, 4.4.7, 4.5.4, 4.6.4, 4.7.3, 4.8.1, 4.8.2, 4.9.0, 4.9.1, 4.9.2, 5.1.0, 5.2.0, 6.0.0
- ICC: ??
- Visual C++: ??
備考
- Clang(libc++) では、C++03 モードでも
fixed | scientific
で 16 進浮動小数点出力を行う。