『C++Primer』ノート二標準IOライブラリの条件状態を再確認する


C++の標準IOライブラリでは、バッファとそのストリームの状態を管理する方法がいくつか指定されています.多くのプログラムは、ストリームが有効であるかどうかを知るだけでよいが、ストリームの状態により詳細にアクセスまたは制御する必要があるプログラムや、ストリームにエラーが発生した場合に具体的にどのようなエラーがあるかを明らかにする必要があるプログラムも排除されない.
まず、標準IOライブラリは、ストリームオブジェクトの4つの状態を1つの列挙で定義します.
enum _Iostate{
	    goodbit = 0x0,  //      
	 	eofbit = 0x1,  //          
		failbit = 0x2,  //         (   )
		badbit = 0x4,  //             (    )
		_Statmask = 0x7};
};

対応する関数を使用してストリームオブジェクトの現在のステータスを返すと、上記の4つのステータス値のいずれかが出力されます.次の手順に従います.
<span style="white-space:pre">	</span>int i;
	cout<<"please enter the i value: ";
	cin>>i;
	cout<<cin.rdstate()<<endl;  //           
入力値がint型の場合、結果は以下の通りである.
入力された値がiに適合する定義タイプである場合、出力されるストリームオブジェクトcinの状態値は0であり、0に対応する状態はgoobitであることがわかる.
入力した値がstring型の場合、結果は次のとおりです.
入力された値がiの定義タイプに合致しない場合、出力されるストリームオブジェクトcinの状態値は2であり、2に対応する状態はfailbitであることがわかる.
ストリームオブジェクトがその中にあるかどうかを反映する4つのアクションがあります.
bool good();  //             true
bool eof();  //            true
bool fail();  //           true
bool bad();  //           true

対流オブジェクトの条件状態を手動で設定する関数もあります.
clear(); //                 
clear(flag);  //                  
setstate(flag);  //          
rdstate();  //          

例を挙げて説明します.次の手順に従います.
int i;
	cout<<"please enter the i value: ";
	cin>>i;
//	cout<<cin.rdstate()<<endl;  //           
	cout<<"before clear the states: "<<cin.good()<<cin.eof()<<cin.fail()<<cin.bad()<<endl;
	cin.clear();
	cout<<"after clear the states: "<<cin.good()<<cin.eof()<<cin.fail()<<cin.bad()<<endl;
の実行結果は次のとおりです.
図のように、入力タイプがstringの場合、cinオブジェクトの現在の状態値はfailbitであり、good()、eof()、bad()の3つの関数の戻り値はfalseであり、fail()関数の戻り値はtrueである.cinのステータスをclearで有効に再設定すると、cinオブジェクトの現在のステータスがgoodbitにリセットされます.すなわち、good()はtrueを返し、他の3つの関数はfalseを返します.条件状態を手動で有効に設定するにはclear(flag)関数を使用します.次のようにします.
int i;
	cout<<"please enter the i value: ";
	cin>>i;
//	cout<<cin.rdstate()<<endl;  //           
	cout<<"before clear the states: "<<cin.good()<<cin.eof()<<cin.fail()<<cin.bad()<<endl;
	cin.clear();
	cout<<"after clear the states: "<<cin.good()<<cin.eof()<<cin.fail()<<cin.bad()<<endl;
	cin.clear(cin.failbit);
	cout<<"set the failbit to true: "<<cin.good()<<cin.eof()<<cin.fail()<<cin.bad()<<endl;
の実行結果は次のとおりです.
小結:各ストリームオブジェクトは、goodbit、badbit、failbit、eofbitなどの状態にある場合があります.rdstate()関数を使用して、ストリームオブジェクトの現在の状態値を返すことができます.次にgood()、eof()、bad()、fail()などの関数を使用して、ストリームオブジェクトが特定の状態にあるかどうかをテストし、そうでなければtrueを返し、そうでなければfalseを返します.次に、clear()関数とclear関数を使用して、ストリームオブジェクトのステータスを手動で変更することもできます.