カスタムタイプのI/O出力の使い方
2462 ワード
カスタムクラスの出力は、クラスが入力出力記号を持って操作できるようにし、クラスが便利に使用できるようにすることです.
構造体がある場合:
簡単な出力を定義し、{"name","num"}のようにフォーマットできます.次のコードです.
対応する入力操作は少し複雑になります.入力フォーマットが正しいかどうかを確認する必要があります.コードは次のとおりです.
注意is>>オペレータはwhitespace(白スペース:スペース、リターンなど)を無視し、is.get(c)は白スペースを一緒に読み込んだものです.だからこのコードのnameはスペースを読み込むことができて、車に戻る記号も名前の中に読むことができます.
例えば、フォーマット{"Macheal Jordan",23}を読み込み、出力も同様のフォーマットです.
完全なテストコードは次のとおりです.
まとめ:
とても便利な1つの技術で、これもC++の特色のある技術の1つです.
Reference:
The C++ Programming Language 4ed
構造体がある場合:
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