最終更新日時(UTC): 2025年08月31日 12時46分41秒
Raclamusi が更新

履歴 編集

type-alias
<ios>

# std::ios_base::fmtflags

    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 進浮動小数点出力を行う。

## 参照

- `ios_base::flags`
- `ios_base::setf`
- `ios_base::unsetf`
- `boolalpha`
- `noboolalpha`
- `showpos`
- `noshowpos`
- `showpoint`
- `noshowpoint`
- `showbase`
- `noshowbase`
- `uppercase`
- `nouppercase`
- `hex`
- `oct`
- `dec`
- `fixed`
- `scientific`
- `hexfloat`
- `defaultfloat`
- `right`
- `internal`
- `left`