出力ストリーム演算子と書式を使用して制御
このトピックではコントロールに書式指定方法独自の出力ストリーム演算子を作成する方法を示します。すべての標準 C++ のデータ型でプリプロセッサを作成する << 挿入 () 演算子は出力ストリームのバイトをオブジェクトに送信します。出力ストリーム演算子は定義済みの 「マニピュレーターを使用して」整数引数の既定の形式を変更する要素です。
次のオプションの形式を制御するには :
出力の幅
[配置]
有効桁数
基数
出力の幅
出力を配置するには項目ごとにストリームに setw のマニピュレーターを配置するか 幅 のメンバー関数を呼び出すことによって出力の幅を指定します。この例で右寄せ列の値 10 以上の文字幅 :
// output_width.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main( )
{
double values[] = { 1.23, 35.36, 653.7, 4358.24 };
for( int i = 0; i < 4; i++ )
{
cout.width(10);
cout << values[i] << '\n';
}
}
出力
1.23
35.36
653.7
4358.24
空白をファースト クラスの値と10 文字より広く追加されます。
フィールドに先行するゼロを埋め込むには指定された幅があるフィールドの埋め込み文字の値を設定する ページ幅に合わせる のメンバー関数を使用します。既定値は null です。次のようにアスタリスクがある数値の列に先行するゼロを埋め込むにはFor のループを変更する :
for( int i = 0; i < 4; i++ )
{
cout.width( 10 );
cout.fill( '*' );
cout << values[i] << endl;
}
endl のマニピュレーターは改行文字 ('\n') を置き換えます。出力は次のようになります。:
******1.23
*****35.36
*****653.7
***4358.24
同じ行のデータ要素に対して幅を指定するにはsetw のマニピュレーターの使用 :
// setw.cpp
// compile with: /EHsc
#include <iostream>
#include <iomanip>
using namespace std;
int main( )
{
double values[] = { 1.23, 35.36, 653.7, 4358.24 };
char *names[] = { "Zoot", "Jimmy", "Al", "Stan" };
for( int i = 0; i < 4; i++ )
cout << setw( 6 ) << names[i]
<< setw( 10 ) << values[i] << endl;
}
出力
幅 のメンバー関数が宣言 <iostream> されます。引数を持つ setw またはそのほかのマニピュレーターを使用すると<iomanip> 含める必要があります。出力では文字列を幅 6 および 10 の整数フィールドの幅のフィールドに出力されます :
Zoot 1.23
Jimmy 35.36
Al 653.7
Stan 4358.24
setw が 幅 の値を切捨てません。書式付き出力の幅を超える場合ストリームの精度の設定を満たす値全体を印刷します。setw と 幅 は次のフィールドだけに影響します。フィールドの幅は既定の動作 (必須) に幅 1 フィールドを出力したら元に戻します。ただし他のストリーム形式オプションが変更されるまで有効です。
[配置]
出力ストリームのテキストを右寄せになります。前の例の名前を左揃え右揃え次のように For の数はループを置き換えます :
for ( int i = 0; i < 4; i++ )
cout << setiosflags( ios::left )
<< setw( 6 ) << names[i]
<< resetiosflags( ios::left )
<< setw( 10 ) << values[i] << endl;
出力は次のようになります。:
Zoot 1.23
Jimmy 35.36
Al 653.7
Stan 4358.24
左揃えのフラグは 左 の列挙子を持つ setiosflags のマニピュレーターを使用して設定します。この列挙子は ios のクラスで定義されます。つまり参照は ios:: のプレフィックスを含める必要があります。resetiosflags のマニピュレーターは左揃えのフラグをオフにします。 幅 と setw とは異なりsetiosflags と resetiosflags の影響は永続的です。
有効桁数
浮動小数点の精度の既定値は 6 です。たとえば3466.98 として 3466.9768 番目の印刷します。この値が印刷する方法を変更するにはsetprecision のマニピュレーターを使用します。マニピュレーターは2 種類のフラグがあります : 固定 と 指数。固定 が設定されている場合3466.976800 に数字が出力されます。 指数 が設定されている場合3.4669773+003 を出力します。
次のように 1 桁の有効桁で 配置 に表示される浮動小数点数を表示するには For のループを置換します :
for ( int i = 0; i < 4; i++ )
cout << setiosflags( ios::left )
<< setw( 6 )
<< names[i]
<< resetiosflags( ios::left )
<< setw( 10 )
<< setprecision( 1 )
<< values[i]
<< endl;
プログラムはこの一覧を出力します :
Zoot 1
Jimmy 4e+001
Al 7e+002
Stan 4e+003
For のループ前に指数表記を削除するにはこのステートメントを挿入します :
cout << setiosflags( ios::fixed );
固定小数点表記では小数点以下の 1 桁の数字はプログラム出力します。
Zoot 1.2
Jimmy 35.4
Al 653.7
Stan 4358.2
ios:: 指数 に ios:: 固定 フラグを変更するとプログラムはこれを出力します :
Zoot 1.2e+000
Jimmy 3.5e+001
Al 6.5e+002
Stan 4.4e+003
さらにプログラムは小数点の後に 1 桁の数字が出力されます。ios:: 固定 または ios:: 指数 が設定されている場合有効桁数の値は後に小数点の桁数を決定します。どちらのフラグが設定されていない場合有効桁数の値が有効桁数の合計数を決定します。resetiosflags のマニピュレーターはこれらのフラグをクリアします。
基数
12 年 7 月 10 年 7 月 と 16 進 のマニピュレーターは入出力の既定の小数点を設定します。たとえば出力ストリームに 16 進 のマニピュレーターを挿入しオブジェクトは 16 進数の出力形式に正しく整数の内部データ表現を変換します。数は小文字の数字 a ~ f と 大文字 フラグをオフにすると表示されます (既定値); それ以外の場合は大文字で表示されます。既定値は 12 年 7 月 の基数 10 (10 進数) です。