カスタムタイプのI/O出力の使い方


カスタムクラスの出力は、クラスが入力出力記号を持って操作できるようにし、クラスが便利に使用できるようにすることです.
構造体がある場合:
struct MyStruct
{
	string name;
	int num;
};

簡単な出力を定義し、{"name","num"}のようにフォーマットできます.次のコードです.
ostream& operator<<(ostream& os, const MyStruct &e)
{
	return os<<"{\""<<e.name<<"\","<<e.num<<"}";
}

対応する入力操作は少し複雑になります.入力フォーマットが正しいかどうかを確認する必要があります.コードは次のとおりです.
istream& operator>>(istream& is, MyStruct& e)
{//  {"name",num}
	char c, c2;
	if(is>>c&&c=='{'&&is>>c2&&c2=='"')
	{
		string name;
		while(is.get(c)&&c!='"')//   ,    "  
			name+=c;
		if(is>>c&&c==',')
		{
			int num=0;
			if(is>>num>>c&&c=='}')
			{
				e.name=name;
				e.num=num;//        
				return is;
			}
		}
	}
	is.setf(ios_base::failbit);//         
	return is;
}

注意is>>オペレータはwhitespace(白スペース:スペース、リターンなど)を無視し、is.get(c)は白スペースを一緒に読み込んだものです.だからこのコードのnameはスペースを読み込むことができて、車に戻る記号も名前の中に読むことができます.
例えば、フォーマット{"Macheal Jordan",23}を読み込み、出力も同様のフォーマットです.
完全なテストコードは次のとおりです.
#include<iostream>
#include<string>

using namespace std;

struct MyStruct
{
	string name;
	int num;
};

ostream& operator<<(ostream& os, const MyStruct &e)
{
	return os<<"{\""<<e.name<<"\","<<e.num<<"}";
}

istream& operator>>(istream& is, MyStruct& e)
{//  {"name",num}
	char c, c2;
	if(is>>c&&c=='{'&&is>>c2&&c2=='"')
	{
		string name;
		while(is.get(c)&&c!='"')//   ,    "  
			name+=c;
		if(is>>c&&c==',')
		{
			int num=0;
			if(is>>num>>c&&c=='}')
			{
				e.name=name;
				e.num=num;//        
				return is;
			}
		}
	}
	is.setf(ios_base::failbit);//         
	return is;
}

int main()
{
	MyStruct myStruct;
	myStruct.name="Micheal Jordan,Hello";
	myStruct.num=23;
	for(;cin>>myStruct;)
		cout<<myStruct<<endl;//      ,        
	return 0;
}

まとめ:
とても便利な1つの技術で、これもC++の特色のある技術の1つです.
Reference:
The C++ Programming Language 4ed