文字列および I/O の書式設定 (Modern C++)

C++ <iostream> のクラス、関数、および演算子は、書式設定された文字列 I/O をサポートしています。 たとえば、次のコードは、整数の書式を 16 進数で出力するように cout を設定する方法を示しています。 まず、書式設定状態が cout に渡されると、変更されるまでそのままになるため、現在の状態を保存してリセットします。 コードの 1 行のみに適用されるわけではありません。

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    ios state(nullptr);

    cout << "The answer in decimal is: " << 42 << endl;

    state.copyfmt(cout); // save current formatting
    cout << "In hex: 0x" // now load up a bunch of formatting modifiers
        << hex
        << uppercase
        << setw(8)
        << setfill('0')
        << 42            // the actual value we wanted to print out
        << endl;
    cout.copyfmt(state); // restore previous formatting
}

この方法はタイプセーフで拡張可能ですが、複雑で詳細な方法でもあります。

代替形式のオプション

別の方法として、非標準ですが、Boost C++ ライブラリの Boost.Format を使用できます。 Boost ライブラリはすべて Boost Web サイトからダウンロードできます。

Boost.Format には次のような利点があります。

  • 安全性: タイプ セーフであり、エラーには例外をスローします。たとえば、指定項目の過多または過少などです。

  • 拡張可能: ストリーム可能なすべての型を処理できます。

  • 便利: 標準 POSIX と類似の書式指定文字列。

Boost.Format は C++ <iostream> 設備で構築されており、安全で拡張可能ですが、パフォーマンスは最適化されていません。 パフォーマンスの最適化が必要な場合には、高速で使いやすい、C の printfsprintf を検討します。 ただし、それらは拡張可能でなく、また脆弱性から安全ではありません。 (セキュリティが強化されたバージョンがありますが、わずかながらパフォーマンスが低下します。詳細については、printf_s, _printf_s_l, wprintf_s, _wprintf_s_lsprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l) を参照してください。

次のコードは、Boost の書式設定機能のいくつかを示します。

    string s = str( format("%2% %2% %1%\n") % "world" % "hello" );
    // s contains "hello hello world"

    for( auto i = 0; i < names.size(); ++i )
        cout << format("%1% %2% %|40t|%3%\n") % first[i] % last[i] % tel[i];
    // Georges Benjamin Clemenceau             +33 (0) 123 456 789
    // Jean de Lattre de Tassigny              +33 (0) 987 654 321

関連項目

C++ へようこそ
C++ 言語リファレンス
C++ 標準ライブラリ
<iostream>
<limits>
<iomanip>