C / C ++スタディノート12の入力と出力(I / O)(2)

一、ostreamとiosで出力

        istreamとostreamはどちらも、iosと呼ばれるクラスから派生しています。ios(およびios_base)の仕事の1つは、出力のフォーマットオプションを制御することです。

        フォーマットオプションを変更するには、フラグとマニピュレータの2つの方法があります。フラグは、オンとオフを切り替えることができるブール変数と考えることができます。マニピュレータは、ストリームに配置されるオブジェクトであり、入出力の方法に影響を与えます。

1.フォーマット

        フラグをオンにするには、引数として適切なフラグを指定してsetf()関数を使用します。たとえば、デフォルトでは、C++は正の数の前に+記号を出力しません。ただし、std :: ios :: showposフラグを使用して、この動作を変更できます。

std::cout.setf(std::ios::showpos); // turn on the std::ios::showpos flag
std::cout << 27 << '\n';

//输出
+27

        ビット単位のOR(|)演算子を使用して、複数のiosフラグを一度にオンにすることができます。

std::cout.setf(std::ios::showpos | std::ios::uppercase); // turn on the std::ios::showpos and std::ios::uppercase flag
std::cout << 1234567.89f << '\n';

//输出
+1.23457E+06

        フラグをオフにするには、unsetf()関数を使用します。

std::cout.setf(std::ios::showpos); // turn on the std::ios::showpos flag
std::cout << 27 << '\n';
std::cout.unsetf(std::ios::showpos); // turn off the std::ios::showpos flag
std::cout << 28 << '\n';

//输出
+27
28

        setf()を使用するときに言及するもう1つのトリックがあります。多くのフラグは、フォーマットグループと呼ばれるグループに属しています。フォーマットグループは、同様の(場合によっては相互に排他的な)フォーマットオプションを実装するフラグのセットです。たとえば、「basefield」という名前のフォーマットグループには、整数値のベースを制御するフラグ「oct」、「dec」、および「hex」が含まれています。デフォルトでは、「dec」フラグが設定されています。だから私たちがそうするなら:

std::cout.setf(std::ios::hex); // try to turn on hex output
std::cout << 27 << '\n';

//输出
27

        うまくいきませんでした!その理由は、setf()がフラグをオンにするだけであるためです。ミューテックスフラグをオフにするほど賢くはありません。したがって、std :: hexを開くと、std :: ios :: decはまだ開いており、std :: ios::decが明らかに優先されます。この問題を解決するには2つの方法があります。

        まず、std :: ios :: decをオフにして、std::hexのみが設定されるようにします。

std::cout.unsetf(std::ios::dec); // turn off decimal output
std::cout.setf(std::ios::hex); // turn on hexadecimal output
std::cout << 27 << '\n';

//输出
1b

        2番目の方法は、2つの引数を取る別の形式のsetf()を使用することです。最初の引数は設定するフラグであり、2番目の引数はそれが属するフォーマットグループです。この形式のsetf()を使用すると、グループに属するすべてのフラグがオフになり、渡されたフラグのみがオンになります。例えば:

std::cout.setf(std::ios::hex, std::ios::basefield);
std::cout << 27 << '\n';

//输出
1b

        setf()とunsetf()の使用は扱いにくい傾向があるため、C++はフォーマットオプションを変更する2番目の方法であるマニピュレーターを提供します。マニピュレータの良いところは、適切なフラグをオンまたはオフにするのに十分スマートなことです。いくつかのマニピュレータを使用してベースを変更する例を次に示します。

std::cout << std::hex << 27 << '\n'; // print 27 in hex
std::cout << 28 << '\n'; // we're still in hex
std::cout << std::dec << 29 << '\n'; // back to decimal

//输出
1b
1c
29

        一般に、フラグを設定および設定解除するよりも、マニピュレータを使用する方がはるかに簡単です。多くのオプションはフラグとマニピュレータ(ベースの変更など)を介して使用できますが、他のオプションはフラグまたはマニピュレータを介してのみ使用できるため、両方の使用方法を知っておくことが重要です。

2.その他のロゴ

(1)boolalpha

         コードリファレンス

std::cout << true << " " << false << '\n';

std::cout.setf(std::ios::boolalpha);
std::cout << true << " " << false << '\n';

std::cout << std::noboolalpha << true << " " << false << '\n';

std::cout << std::boolalpha << true << " " << false << '\n';

//输出

1 0
true false
1 0
true false

(2)showpos 

         参照コード

std::cout << 5 << '\n';

std::cout.setf(std::ios::showpos);
std::cout << 5 << '\n';

std::cout << std::noshowpos << 5 << '\n';

std::cout << std::showpos << 5 << '\n';

//输出

5
+5
5
+5

(3)大文字 

         参照コード

std::cout << 12345678.9 << '\n';

std::cout.setf(std::ios::uppercase);
std::cout << 12345678.9 << '\n';

std::cout << std::nouppercase << 12345678.9 << '\n';

std::cout << std::uppercase << 12345678.9 << '\n';

//输出

1.23457e+007
1.23457E+007
1.23457e+007
1.23457E+007

(4)異なるベースを表示する 

std::cout << 27 << '\n';

std::cout.setf(std::ios::dec, std::ios::basefield);
std::cout << 27 << '\n';

std::cout.setf(std::ios::oct, std::ios::basefield);
std::cout << 27 << '\n';

std::cout.setf(std::ios::hex, std::ios::basefield);
std::cout << 27 << '\n';

std::cout << std::dec << 27 << '\n';
std::cout << std::oct << 27 << '\n';
std::cout << std::hex << 27 << '\n';

//输出

27
27
33
1b
27
33
1b

(5)精度、符号、小数点

        マニピュレータ(またはフラグ)を使用して、表示される浮動小数点数の精度と形式を変更できます。いくつかの複雑な方法で組み合わされたいくつかのフォーマットオプションがあるので、詳しく見ていきます。

        固定記数法または科学的記数法を使用する場合、精度によって、小数部に表示される小数点以下の桁数が決まります。精度が仮数未満の場合、数値は丸められることに注意してください。

std::cout << std::fixed << '\n';
std::cout << std::setprecision(3) << 123.456 << '\n';
std::cout << std::setprecision(4) << 123.456 << '\n';
std::cout << std::setprecision(5) << 123.456 << '\n';
std::cout << std::setprecision(6) << 123.456 << '\n';
std::cout << std::setprecision(7) << 123.456 << '\n';

std::cout << std::scientific << '\n';
std::cout << std::setprecision(3) << 123.456 << '\n';
std::cout << std::setprecision(4) << 123.456 << '\n';
std::cout << std::setprecision(5) << 123.456 << '\n';
std::cout << std::setprecision(6) << 123.456 << '\n';
std::cout << std::setprecision(7) << 123.456 << '\n';

//输出
123.456
123.4560
123.45600
123.456000
123.4560000

1.235e+002
1.2346e+002
1.23456e+002
1.234560e+002
1.2345600e+002

        固定も科学も使用されていない場合、精度によって表示される有効桁数が決まります。同様に、精度が仮数よりも低い場合、数値は丸められます。

std::cout << std::setprecision(3) << 123.456 << '\n';
std::cout << std::setprecision(4) << 123.456 << '\n';
std::cout << std::setprecision(5) << 123.456 << '\n';
std::cout << std::setprecision(6) << 123.456 << '\n';
std::cout << std::setprecision(7) << 123.456 << '\n';

//输出

123
123.5
123.46
123.456
123.456

        ショーポイントマニピュレータまたはフラグを使用して、ストリームに小数点と末尾のゼロを書き込むことができます。

std::cout << std::showpoint << '\n';
std::cout << std::setprecision(3) << 123.456 << '\n';
std::cout << std::setprecision(4) << 123.456 << '\n';
std::cout << std::setprecision(5) << 123.456 << '\n';
std::cout << std::setprecision(6) << 123.456 << '\n';
std::cout << std::setprecision(7) << 123.456 << '\n';

//输出

123.
123.5
123.46
123.456
123.4560

        以下に、その他の例を含む要約表を示します。

 (6)幅、パディング文字、配置

        通常、数字を印刷すると、周囲のスペースに関係なく数字が印刷されます。ただし、数字の印刷は左揃えまたは右揃えにすることができます。これを行うには、最初にフィールド幅を定義する必要があります。これは、値が持つ出力スペースの量を定義します。実際に印刷される数値がフィールド幅よりも小さい場合は、左揃えまたは右揃えになります(指定どおり)。実際の数値がフィールド幅よりも大きい場合、切り捨てられることはなく、フィールドがオーバーフローします。

        これらのフォーマッタのいずれかを使用するには、最初にフィールド幅を設定する必要があります。これは、width(int)メンバー関数またはsetw()マニピュレーターを使用して実行できます。右揃えがデフォルトであることに注意してください。

std::cout << -12345 << '\n'; // print default value with no field width
std::cout << std::setw(10) << -12345 << '\n'; // print default with field width
std::cout << std::setw(10) << std::left << -12345 << '\n'; // print left justified
std::cout << std::setw(10) << std::right << -12345 << '\n'; // print right justified
std::cout << std::setw(10) << std::internal << -12345 << '\n'; // print internally justified

//输出

-12345
    -12345
-12345
    -12345
-    12345

        注意すべきことの1つは、setw()とwidth()は次の出力ステートメントにのみ影響するということです。それらは他のいくつかの旗/マニピュレーターほど耐久性がありません。

        次に、パディング文字を設定して同じ例を実行しましょう。

std::cout.fill('*');
std::cout << -12345 << '\n'; // print default value with no field width
std::cout << std::setw(10) << -12345 << '\n'; // print default with field width
std::cout << std::setw(10) << std::left << -12345 << '\n'; // print left justified
std::cout << std::setw(10) << std::right << -12345 << '\n'; // print right justified
std::cout << std::setw(10) << std::internal << -12345 << '\n'; // print internally justified

//输出

-12345
****-12345
-12345****
****-12345
-****12345

        このフィールドのすべてのスペースはパディング文字で埋められていることに注意してください。

        ostreamクラスとiostreamライブラリには、実行する必要がある内容に応じて役立つ可能性のある他の出力関数、フラグ、およびマニピュレータが含まれています。

おすすめ

転載: blog.csdn.net/bashendixie5/article/details/125026924