文字列および 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 の 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
関連項目
C++ へようこそ
C++ 言語リファレンス
C++ 標準ライブラリ
<iostream>
<limits>
<iomanip>