C++coutフォーマット出力

21666 ワード

変換元:http://c.biancheng.net/view/275.html
C++coutフォーマット出力(出力フォーマット)完全攻略
16進数で整数を出力し、浮動小数点数を出力するときは小数点以下の2桁を残し、整数を出力するときは6桁の幅で出力し、幅が足りないときは左に0を補うなど、一定のフォーマットで出力したい場合があります.C++でcoutで出力する場合は,フローマニピュレータによるフォーマット制御が可能である.
C++でよく用いられる出力ストリームマニピュレータ演算子(フォーマット制御子とも呼ばれる)を表1に示す.これらはすべてヘッダファイルiomanipで定義されています.これらのストリームを使用して演算子を操作するには、ヘッダファイルを含める必要があります.
表1:C++フローマニピュレータ
フローオペレータ
作る 使用する
*dec
10進数で整数を出力
よく使う
hex
16進数で整数を出力
oct
整数を8進数で出力
fixed
浮動小数点数を通常小数点数で出力
scientific
科学カウント法で浮動小数点数を出力する
left
左揃え
*right
右揃え(幅が足りないときに左に入力文字を追加)
setbase(b)
出力整数を設定するときの進数、b=8、10または16
setw(w)
出力幅w文字、または入力文字列を指定するときにw文字を読み込む
setfill(c)
出力幅を指定した場合、出力の幅が足りない場合は文字cで埋めます(デフォルトはスペースで埋めます)
setprecision(n)
出力浮動小数点数の精度をnに設定します.非fixedかつ非scientificの使用 方式出力の場合、nは有効数字が最も多い桁数であり、有効数字がnを超えると、小数部を5人切り捨てるか、科学計数法に自動的に変化して合計n桁の有効数字を保持する.fixed方式とscientific方式で出力する場合、nは小数点以下に保持すべき桁数である
setiosflags(フラグ)
出力フォーマットフラグを1に設定
resetiosflags
出力フォーマットフラグを0に設定
boolapha
trueとfalseを文字列に出力する
非常用
*noboolalpha
trueとfalseを0、1に出力
showbase
数値を表す進数の接頭辞を出力
*noshowbase
数値を表す進数を出力しない.の接頭辞
showpoint
常に小数点を出力
*noshowpoint
小数点が表示されるのは、小数点が存在する場合のみです
showpos
負以外の値に+を表示
*noshowpos
負以外の値に+を表示しない
*skipws
入力時に空白文字をスキップ
noskipws
入力時に空白文字をスキップしない
uppercase
16進数にA~Eを用いる.接頭辞を出力すると接頭辞が出力されます 0 X,科学計数法における出力E
*nouppercase
16進数にはa~eを用いる.接頭辞を出力すると、接頭辞は0 xを出力し、科学カウント法ではeを出力する.
internal
数値の記号(正と負の記号)は、指定した幅内で左揃え、数値右揃え、中央は塗りつぶし文字で塗りつぶされます.
表1の「フローマニピュレータ演算子」バーのアスタリスク*は演算子の一部ではなく、アスタリスクは演算子が何も使用されていない場合、その演算子が使用されたことに等しいことを示します.たとえば、デフォルトでは、dec演算子を使用するのと同じように、整数は10進数で出力されます.
これらの演算子を使用する方法は、演算子を<
       

       
       
       
       
  1. cout << hex << 12 << "," << 24;
cout << hex << 12 << "," << 24;

この文の役割は、次の2つの数を16進数で出力することです.したがって、出力結果は次のとおりです.
c, 18
setiosflags演算子は実際にはライブラリ関数であり、いくつかのフラグをパラメータとして使用します.これらのフラグはiostreamヘッダファイルで定義された以下のいくつかの値であり、その意味は同名演算子と同じです.
       

       
       
       
       
  1. ios::left ios::right ios::internal
  2. ios::showbase ios::showpoint ios::uppercase ios::showpos
  3. ios::scientific ios::fixed
ios::left          ios::right        ios::internal
ios::showbase      ios::showpoint    ios::uppercase    ios::showpos
ios::scientific    ios::fixed

これらのフラグは、実際には、あるビットのみが1であり、他のビットは0の整数である.
複数のフラグが使用可能|演算子接続、同時設定を示します.例:
       

       
       
       
       
  1. cout << setiosflags(ios::scientific|ios::showpos) << 12.34;
cout << setiosflags(ios::scientific|ios::showpos) << 12.34;

出力結果は次のとおりです.
+1.234000e+001
2つの矛盾するフラグが同時に設定され、setiosflags(ios::fixed)が先に設定され、setiosflags(ios::scientific)が設定されている場合、結果として2つのフラグが機能しない可能性があります.したがって、あるフラグを設定し、他の矛盾するフラグを設定する場合はresetiosflagsで元のフラグをクリアする必要があります.たとえば、次の3つの文があります.
       

       
       
       
       
  1. cout << setiosflags(ios::fixed) << 12.34 << endl;
  2. cout << resetiosflags(ios::fixed) << setiosflags(ios::scientific | ios::showpos) << 12.34 << endl;
  3. cout << resetiosflags(ios::showpos) << 12.34 << endl; //
cout << setiosflags(ios::fixed) << 12.34 << endl;
cout << resetiosflags(ios::fixed) << setiosflags(ios::scientific | ios::showpos) << 12.34 << endl;
cout << resetiosflags(ios::showpos) << 12.34 << endl;  //          

出力結果は次のとおりです.
12.340000
+1.234000e+001
1.234000e+001
フローマニピュレータ演算子の使用については,以下の手順を見る.
       

       
       
       
       
  1. #include
  2. #include
  3. using namespace std;
  4. int main()
  5. {
  6. int n = 141;
  7. //1) 、 、 n
  8. cout << "1)" << hex << n << " " << dec << n << " " << oct << n << endl;
  9. double x = 1234567.89, y = 12.34567;
  10. //2) 5
  11. cout << "2)" << setprecision(5) << x << " " << y << " " << endl;
  12. //3) 5
  13. cout << "3)" << fixed << setprecision(5) << x << " " << y << endl;
  14. //4) , 5
  15. cout << "4)" << scientific << setprecision(5) << x << " " << y << endl;
  16. //5) , 12 , *
  17. cout << "5)" << showpos << fixed << setw(12) << setfill('*') << 12.1 << endl;
  18. //6) , 12 ,
  19. cout << "6)" << noshowpos << setw(12) << left << 12.1 << endl;
  20. //7) 12 ,
  21. cout << "7)" << setw(12) << right << 12.1 << endl;
  22. //8) , ,
  23. cout << "8)" << setw(12) << internal << -12.1 << endl;
  24. cout << "9)" << 12.1 << endl;
  25. return 0;
  26. }
#include 
#include 
using namespace std;
int main()
{
    int n = 141;
    //1)        、   、        n
    cout << "1)" << hex << n << " " << dec << n << " " << oct << n << endl;
    double x = 1234567.89, y = 12.34567;
    //2)  5     
    cout << "2)" << setprecision(5) << x << " " << y << " " << endl;
    //3)       5 
    cout << "3)" << fixed << setprecision(5) << x << " " << y << endl;
    //4)       ,        5 
    cout << "4)" << scientific << setprecision(5) << x << " " << y << endl;
    //5)       ,     12  ,       *   
    cout << "5)" << showpos << fixed << setw(12) << setfill('*') << 12.1 << endl;
    //6)        ,     12  ,              
    cout << "6)" << noshowpos << setw(12) << left << 12.1 << endl;
    //7)      12   ,              
    cout << "7)" << setw(12) << right << 12.1 << endl;
    //8)     ,         ,         
    cout << "8)" << setw(12) << internal << -12.1 << endl;
    cout << "9)" << 12.1 << endl;
    return 0;
}

プログラムの出力結果は次のとおりです.
1)8d 141 215
2)1.2346e+06 12.346
3)1234567.89000 12.34567
4)1.23457e+06 1.23457e+01
5)***+12.10000
6)12.10000****
7)****12.10000
8)-***12.10000
9)12.10000
setw演算子が果たす役割は、次の出力にのみ影響を及ぼす使い捨てであることに注意してください.出力幅を指定するたびにsetwを使用します.したがって,9)行目の出力はsetwを用いないため,出力の幅は前に指定した12文字ではないことがわかる.
文字列を読み込むと、setwはcinの動作にも影響します.たとえば、次のプログラムがあります.
       

       
       
       
       
  1. #include
  2. #include
  3. using namespace std;
  4. int main()
  5. {
  6. string s1, s2;
  7. cin >> setw(4) >> s1 >> setw(3) >> s2;
  8. cout << s1 << "," << s2 << endl;
  9. return 0;
  10. }
#include 
#include 
using namespace std;
int main()
{
    string s1, s2;
    cin >> setw(4) >> s1 >> setw(3) >> s2;
    cout << s1 << "," << s2 << endl;
    return 0;
}

入力:
1234567890↙
プログラムの出力結果は次のとおりです.
1234,567
説明setw(4)s 1を読み込む場合、4文字のみが読み込まれ、その後のsetw(3)は、s 2を読み込むときに3文字しか読み込まないようにする.
setwがcinに使用される場合、同じように次の負け者にのみ影響します.
思考問題:setwはどのように実現され、coutと接続して出力幅を指定できるのか.コンパイラに付属するiomanipヘッダファイルを自分で表示し、setwとまったく同じ機能のmysetwを書きます.
coutを呼び出すメンバー関数ostreamクラスには、表2に示すように、cout呼び出しによって出力のフォーマットを制御するためにも使用できるメンバー関数があります.
表2:ostreamクラスのメンバー関数
メンバー関数
同じフローマニピュレータ
precision(n)
setprecision(n)
width(w)
setw(w)
fill(c)
setfill (c)
setf(フラグ)
setiosflags(フラグ)
unsetf(フラグ)
resetiosflags
 
setfおよびunsetf関数で使用される「フラグ」は、setiosflagsおよびresetiosflagsで使用されるのと全く同じです.
これらのメンバー関数の使用は簡単です.たとえば、次の3行のプログラムです.
       

       
       
       
       
  1. cout.setf(ios::scientific);
  2. cout.precision(8);
  3. cout << 12.23 << endl;
cout.setf(ios::scientific);
cout.precision(8);
cout << 12.23 << endl;

出力結果は次のとおりです.
1.22300000e+001
coutには、1文字を出力するメンバー関数putがあります.パラメータのタイプはintで、出力する文字を表すASCIIコードです.戻り値はcoutの参照です.たとえば、次の2つの文があります.
       

       
       
       
       
  1. cout.put('a');
  2. cout.put(98).put('c').put('z');
cout.put('a');
cout.put(98).put('c').put('z');

出力結果は次のとおりです.
abcz
98は'b'のASCIIコードで、'a'と'z'はすべて自動的に整数に変換することができて、つまり文字の対応するASCIIコードです.