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

C++ 入出力ストリームは、書式設定された文字列の 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++ 入出力ストリーム上で構築されており、安全で拡張可能ですが、パフォーマンスは最適化されていません。 パフォーマンスの最適化が必要な場合には、高速で使いやすい、C の printf および sprintf を検討します。 ただし、それらは拡張可能でなく、また脆弱性から安全ではありません。(セキュリティが強化されたバージョンがありますが、わずかながらパフォーマンスが低下します。 詳細については、「printf_s、_printf_s_l、wprintf_s、_wprintf_s_l」および「sprintf_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

参照

関連項目

<iostream>

<limits>

<iomanip>

その他の技術情報

C++ へようこそ (Modern C++)

C++ 言語リファレンス

C++ 標準ライブラリ リファレンス