コンテンツにスキップ

C++/標準ライブラリ/iomanip

出典: フリー教科書『ウィキブックス(Wikibooks)』

C++教科書/標準ライブラリ編/<iomanip>の章

[編集]

<iomanip> ヘッダーの概要

[編集]

C++標準ライブラリ ヘッダー <iomanip> は、入出力操作のフォーマット設定を可能にする機能を提供します。具体的には、以下の操作を実行できます。

  • 入出力フィールドの幅と精度を設定する
  • フィル文字を設定する
  • フォーマットフラグを設定する
  • 通貨の入出力を行う (C++11 以降)
  • 日付時刻の入出力を行う (C++11 以降)
  • クォート付き文字列の入出力を行う (C++14 以降)

これらの機能を使用することで、より見やすく、読みやすい入出力結果を生成することができます。

フォーマットフラグ

[編集]

<iomanip> ヘッダーは、入出力操作に適用できるさまざまなフォーマットフラグを提供します。これらのフラグは、ios_base クラスに定義されています。主なフラグとその効果は以下のとおりです。

  • fixed: 浮動小数点数を固定小数点表記で出力します。
  • scientific: 浮動小数点数を指数表記で出力します。
  • left: 出力フィールドを左寄せします。
  • right: 出力フィールドを右寄せします。
  • showbase: 整数リテラルの前後に基数を表示します。
  • showpos: 正の数値の前後に符号 '+' を表示します。
  • uppercase: アルファベットを大文字で出力します。
  • lowercase: アルファベットを小文字で出力します。

これらのフラグは、setiosflags 関数を使用して設定できます。setiosflags 関数の引数には、設定するフラグをビットフラグ形式で渡します。

#include <iomanip>

int main() {
    std::cout << std::fixed << 3.1415926535;       // 3.14159
    std::cout << std::scientific << 3.1415926535;  // 3.14159e+00
    return 0;
}

上記のように、fixed フラグを設定すると、浮動小数点数が固定小数点表記で出力され、scientific フラグを設定すると指数表記で出力されます。

フラグを解除するには、resetiosflags 関数を使用します。

#include <iomanip>

int main() {
    std::cout << std::fixed << std::showbase << 10 << std::endl;  // 0x0a
    std::cout << std::resetiosflags(std::ios_base::showbase) << 10
              << std::endl;  // 10
    return 0;
}

上記のように、showbase フラグを設定して 10 を出力した後、resetiosflags 関数を使用して showbase フラグを解除すると、基数が表示されずに 10 が出力されます。

入出力幅と精度

[編集]

<iomanip> ヘッダーは、入出力フィールドの幅と浮動小数点数の表示精度を設定する機能を提供します。

  • setw 関数は、出力フィールドの幅を設定します。引数には、フィールドの幅を整数値で渡します。
  • setprecision 関数は、浮動小数点数の表示精度を設定します。引数には、表示する小数点以下の桁数を整数値で渡します。
#include <iomanip>

int main() {
    std::cout << std::setw(10) << 3.1415926535;         //      3.14159
    std::cout << std::setprecision(3) << 3.1415926535;  // 3.14
    return 0;
}

上記のように、setw 関数を使用してフィールドの幅を 10 に設定すると、数値が右寄せで出力されます。また、setprecision 関数を使用して表示精度を 3 に設定すると、浮動小数点数が 3 桁まで表示されます。

フィル文字

[編集]

<iomanip> ヘッダーは、入出力フィールドの右寄せや左寄せを行う際に、空白以外の文字を埋めるためのフィル文字を設定する機能を提供します。

  • setfill 関数は、フィル文字を設定します。引数には、フィル文字を表す文字を X 値として渡します。
#include <iomanip>
#include <iostream>

int main() {
    // 入力を取得
    double radius;
    std::cout << "円の半径を入力してください: ";
    std::cin >> radius;

    // 円周と面積を計算
    double circumference = 2 * M_PI * radius;
    double area = M_PI * radius * radius;

    // 結果を出力
    std::cout << std::setprecision(3) << std::fixed;
    std::cout << "円周: " << std::setw(10) << std::left << std::fill_char('*')
              << circumference << std::endl;  // 左寄せ、「*」で埋める
    std::cout << "面積: " << std::setw(10) << std::right << std::fill_char('#')
              << area << std::endl;  // 右寄せ、「#」で埋める

    return 0;
}

このプログラムでは、std::setfill 関数を使用してフィル文字を設定し、std::setw 関数と組み合わせて出力フィールドの幅とフィル文字を設定しています。

通貨入出力 (C++11 以降)

[編集]

C++11 以降では、<iomanip> ヘッダーを使用して通貨の入出力を行うことができます。

  • get_money 関数は、文字列から通貨値を入力します。引数には、入力する通貨値を格納する変数と、オプションで国際通貨フォーマットを使用するかどうかを指定するフラグを渡します。
  • put_money 関数は、通貨値を文字列に出力します。引数には、出力する通貨値と、オプションで国際通貨フォーマットを使用するかどうかを指定するフラグを渡します。
#include <iomanip>

int main() {
    double price = 123.45;
    std::string str;

    // 文字列から通貨値を入力
    std::cout << "金額を入力してください: ";
    std::cin >> std::get_money(price);

    // 通貨値を文字列に出力
    std::cout << "金額: " << std::setprecision(2) << std::fixed
              << std::put_money(price) << std::endl;

    return 0;
}

上記のように、get_money 関数を使用して文字列から通貨値を入力し、put_money 関数を使用して通貨値を文字列に出力することができます。

日付時刻入出力 (C++11 以降)

[編集]

C++11 以降では、<iomanip> ヘッダーを使用して日付時刻の入出力を行うことができます。

  • get_time 関数は、指定されたフォーマットの文字列から日付時刻を取得します。引数には、取得する日付時刻を格納する構造体と、入力する文字列と、入力フォーマットを表す文字列を渡します。
  • put_time 関数は、日付時刻を指定されたフォーマットの文字列に出力します。引数には、出力する日付時刻と、出力フォーマットを表す文字列を渡します。
#include <ctime>
#include <iomanip>

int main() {
    tm t;
    std::string str;

    // 文字列から日付時刻を取得
    std::cout << "日付を入力してください (YYYY-MM-DD): ";
    std::cin >> str;
    std::istringstream iss(str);
    iss >> std::get_time(&t, "%Y-%m-%d");

    // 日付時刻を文字列に出力
    std::cout << "日付: " << std::put_time(&t, "%c") << std::endl;

    return 0;
}

上記のように、get_time 関数を使用して文字列から日付時刻を取得し、put_time 関数を使用して日付時刻を文字列に出力することができます。

クォート付き文字列 (C++14 以降)

[編集]

C++14 以降では、<iomanip> ヘッダーを使用してクォート付き文字列 (スペースを含む文字列) の入出力を行うことができます。

  • quoted 関数は、クォート付き文字列の入出力を行います。引数には、入力または出力する文字列と、オプションで使用するデリミタ文字とエスケープ文字を渡します。
#include <ctime>
#include <iomanip>

int main() {
    tm t;
    std::string str;

    // 文字列から日付時刻を取得
    std::cout << "日付を入力してください (YYYY-MM-DD): ";
    std::cin >> str;
    std::istringstream iss(str);
    iss >> std::get_time(&t, "%Y-%m-%d");

    // 日付時刻を文字列に出力
    std::cout << "日付: " << std::put_time(&t, "%c") << std::endl;

    return 0;
}

上記のように、quoted 関数を使用してクォート付き文字列の入出力を行うことができます。

まとめ

[編集]

C++標準ライブラリ ヘッダー <iomanip> は、入出力操作のフォーマット設定を可能にする機能を提供します。具体的には、以下の操作を実行できます。

  • 入出力フィールドの幅と精度を設定する
  • フィル文字を設定する
  • フォーマットフラグを設定する
  • 通貨の入出力を行う (C++11 以降)
  • 日付時刻の入出力を行う (C++11 以降)
  • クォート付き文字列の入出力を行う (C++14 以降)

これらの機能を使用することで、より見やすく、読みやすい入出力結果を生成することができます。