自定义类型的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;
}


总结:

很方便的一个技术,这也是C++的特色技术之一。

Reference:

The C++ Programming Language 4ed

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值