文字列および 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