41、C++Primer 4 thノート、IOライブラリ、フォーマットIO操作

4670 ワード

1、条件状態に加えて、iostreamオブジェクトごとにIOフォーマットの詳細を制御する状態を維持する.例えば、整形値の基数、浮動小数点値の精度、出力要素の幅など.標準ライブラリでは、オブジェクトのフォーマットステータスを変更するマニピュレータのセットも定義されています.マニピュレータ(manipulator)は、入力演算子または出力演算子として使用できるオペランドであり、関数またはオブジェクト(a manipulator is a function or objectthat can be used as an operand([計]オペランド;演算オブジェクト)to an input or output operator(演算子).)である.マニピュレータは、適用されたストリームオブジェクトを返します.したがって、1つの文に複数のマニピュレータとデータを出力できます.
2、マニピュレータの羅列
表1 iostreamで定義したマニピュレータ
boolalpha
真と偽を文字列として表示
x
noboolalpha
真と偽を1,0として表示
showbase
指摘数の基数を生成する接頭辞
x
noshowbase
記数ベース接頭辞を生成しない
showpoint
常に小数点を表示
x
noshowpoint
小数点を表示するには小数点がある
showpos
負数以外の+を表示
x
noshowpos
負以外の数の+は表示されません
uppercase
16進数で0 Xを印刷し、科学記数法でEを印刷する
x
nouppercase
16進法で0 xを印刷し、科学記数法でeを印刷する
x
dec
10進数で表示(整形値、符号点数は影響を受けません)
hex
16進数で表示(整形値、符号点数は影響を受けません)
oct
8進法で表示(同上)
left
値の右に入力文字を追加
right
値の左に入力文字を追加
internal
記号と値の間に入力文字を追加
fixed
小数点数表示
scientific
科学的記数法で浮動小数点数を表示する
boolalpha
真と偽を文字列として表示
flush
OStreamバッファのリフレッシュ
ends
空の文字を挿入し、ostreamバッファをリフレッシュします.
endl
改行を挿入し、ostreamバッファをリフレッシュします.
unitbuf
各出力操作の後にバッファをリフレッシュ
x
nounitbuf
通常のバッファ・リフレッシュの復元
x
skipws
入力オペレータの空白をスキップ
noskipws
入力オペレータの空白をスキップしない
ws
空白を「食べる」
注意:x付きはデフォルトのストリームステータスです.
表2 iomanipで定義したマニピュレータ
setfill(ch)
chで空白を埋める
setprecision(n)
浮動小数点精度をnに設定
setw(w)
読み書きw文字の値
setbase(b)
基数bで整数を出力
3、マニピュレータを読み書きするときは、データを読み書きせず、逆に何らかの行動をとる.ストリームフォーマットの状態を変更するマニピュレータは、通常、後続のIOに対して変更後のフォーマット状態を保持する.マニピュレータの状態変更をキャンセルするのは通常が一番です.一般に、ストリームは、各IOオペレーションの後に通常のデフォルト状態にあるべきである.フォーマットの状態を変更したマニピュレータの多くは、設定/復元ペアを提供し、1つのマニピュレータはフォーマットの状態を新しい値に設定し、もう1つは復元し、通常のデフォルトのフォーマットを復元します.
4、flags操作でフォーマット状態を回復する
flagsオペレーションは、ストリームの条件状態を管理するrdstateオペレーションとsetstateオペレーションと同様です.この場合、標準ライブラリはflags関数のペアを定義します.
•実パラメータを持たないflags()は、ストリームの現在のフォーマット状態を返します.戻り値は、fmtflagsという標準ライブラリ定義タイプです.
•flags(arg)は、実パラメータを受け入れ、ストリームフォーマットを実パラメータで指定したフォーマットに設定します.
サンプルコード
void display(ostream& os)

{

	//remember the current format state

	ostream::fmtflags curr_fmt = os.flags();

	//do output that uses manipulators that change the format state of os

	os.flags(curr_fmt); //restore the original format state of os

}


5、制御出力フォーマット
出力制御には、数値の表示を制御するとともに、パディングのデータとレイアウトを制御する2つのクラスがあります.
サンプルコード
int main()

{	

	bool bool_val;

	cout << boolalpha

		 << bool_val

		 << noboolalpha;

	return 1;

}


6、浮動小数点値のフォーマットを制御する
1)浮動小数点値のフォーマットでは、次の3つの側面を制御できます.
•精度:数桁(総桁数)を表示します.
•記数法:小数表記か科学表記かで表示されます.
•整数の浮動小数点値である小数点の処理.
サンプルコード
int main()

{	

	cout << "Precision: " << cout.precision()

		 << ", value: " << sqrt(2.0) << endl;

	int prev_precision = cout.precision(12);

	cout << ", value: " << sqrt(2.0) << endl;

	cout << setprecision(prev_precision);

	cout << ", value: " << sqrt(2.0) << endl;

	return 1;

}


2)浮動小数点値を回復するためのデフォルトの記数法
他のオペレータとは異なり、unsetfメンバーを呼び出してscientificまたはfixedの変更をキャンセルする必要があります.
サンプルコード
#include <iostream>

#include "string"

#include "cmath"

using namespace std;



int main()

{	

	cout << sqrt(2.0) << '
' << endl; cout << scientific << sqrt(2.0) << endl; cout << fixed << sqrt(2.0) << endl; //reset to default handling for notation cout.unsetf(ostream::floatfield); cout << sqrt(2.0) << endl; return 1; }

7、パディング出力
•setwは、次の数値または文字列の最小間隔を指定します.
•left、左揃え出力.
•right、右揃え出力.出力の既定値は右揃えです.
•internal、負の値のシンボル位置を制御します.internalは記号を左に揃え、値を右に揃え、その間の空間をスペースで埋めます.
•setfillでは、出力を入力するときに使用する別の文字を指定できます.デフォルトでは、値はスペースです.
endlのようにsetwは出力ストリームの内部状態を変更せず,次の出力の長さのみを決定する.
サンプルコード
#include <iostream>

#include "string"

#include "cmath"

#include "iomanip"

using namespace std;



int main()

{	

	int i = -16;

	double d = 3.14159;

	cout << setfill('#')

		 << "i: " << setw(12) << i << endl

		 << "d: " << setw(12) << d << endl

		 << setfill(' '); //restore normal pad character

	return 1;

}


8、デフォルトでは、入力オペレータは空白(スペース、タブ、改行、給紙、およびリターン)を無視します.noskipwsは、空白をスキップしないように強制します.