【C++】IO流

1.自定义类型与内置类型的相互转化

​ 在做IO类型的OJ的时候,有多个接收样例的时候,在接收字符串的时候我们有下面的写法。

while(cin>>str);

在这里插入图片描述

​ cin>>str的返回值调用的是string类的operator>>;返回值是一个iostream,按道理说一个iostream无法作为一个逻辑判断。所以我们推测cin应该发生了类型的转化,转换为了一个bool类型的值。

在这里插入图片描述

1.1operator 类型

在C++中可以对类型进行重载,从而达到自定义类型与内置类型的相互转化

由于转化的过程中发生的是隐士类型转化,生成了临时变量,临时变量具有常性,所以需要使用const修饰。

下面程序实现了Date类的operator bool和operator int函数

在这里插入图片描述

输出:

The year >= 2015
the year+month+day=:2035

2.C++文件IO

C++实现了一个庞大的IO库,其中以ios为基类;在这里插入图片描述

类名功能
ifstream创建一个只输入用的对象
ofstream创建一个只输出用的对象
fstream既可以输入也可以输出

使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系

比如我们读取当前主程序io.cpp中的内容

在这里插入图片描述

int main()
{
    ifstream ifs("io.cpp");
    char ch;
    while (ifs)
    {
        ch = ifs.get();
        cout << ch;
    }
    cout << endl;
    return 0;
}

在这里插入图片描述

将io.cpp写到一个名为io.txt的文件中

在这里插入图片描述

int main()
{
    ifstream ifs("io.cpp");
    ofstream ofs("io.txt");
    char ch;
    while (ifs)
    {
        ch = ifs.get();
        cout << ch;
        ofs << ch;
    }
    cout << endl;
    return 0;
}

在这里插入图片描述

注意到,在读取文件内容的时候,我们多读取了一个字符,该字符是文件的标志EOF;我们可以使用eof接口取消对EOF的读取

int main()
{
    ifstream ifs("io.cpp");
    ofstream ofs("io.txt");
    char ch;
    ch = ifs.get();
    while (!ifs.eof())
    {
        cout << ch;
        ofs << ch;
        ch = ifs.get();
    }
    cout << endl;
    return 0;
}

在这里插入图片描述

3.C++文件IO的二进制读取和文本读取

struct ServerInfo
{
	char _address[256];
	int _port;
	Date _d;
};
struct ConfigManager
{
public:
	ConfigManager(const char* filename)
		:_filename(filename)
	{}
	//二进制写
	void writebin(const ServerInfo& info)
	{
		//以二进制写的方式打开文件
		ofstream ofs(_filename, ios_base::out | ios_base::binary);
		ofs.write((const char*)&info, sizeof(info));
	}

	void readbin(ServerInfo& info)
	{
		//以二进制读的方式打开文件
		ifstream ifs(_filename, ios_base::in | ios_base::binary);
		ifs.read((char*)&info, sizeof(info));
	}
	// 文本读写
	void writetext(const ServerInfo& info)
	{
		ofstream ofs(_filename);
		ofs << info._address << endl;
		ofs << info._port << endl;
		ofs << info._d << endl;
	}
	void readtext(ServerInfo& info)
	{
		ifstream ifs(_filename);
		ifs >> info._address;
		ifs >> info._port;
		ifs >> info._d;
	}
private:
	string _filename;
};

主程序

int main()
{
	ConfigManager mg("test.txt");
	ServerInfo info = { "https://www.bilibili.com/",22,{2022,10,12} };
	mg.writetext(info);
	ServerInfo rinfo;
	mg.readtext(rinfo);
	cout << rinfo._address << " " << rinfo._port << " " << rinfo._d << endl;
	return 0;
}

输出:https://www.bilibili.com/ 22 2022 10 12

在这里插入图片描述

4.stringstream 类

将数值类型数据格式化为字符串

int main()
{
	int a = 123456789;
	stringstream s;
	s << a;
	string ss;
	s >> ss;
	cout << "a转换为字符串:" << ss << endl;
	//将原来流中的字符清理掉
	s.str(" ");
	double d = 12.34;
	s << d;
	s >> ss;
	cout << "d转换为字符串:" <<d<< endl;
	return 0;
}

输出:

a转换为字符串:123456789
d转换为字符串:12.34

字符串拼接

int main()
{
	stringstream sstream;
	sstream << "this is" << " " << "first string,";
	sstream << "this is second string";
	cout << sstream.str() << endl;
	sstream.str("");
	sstream << "this is thrid string";
	cout << sstream.str() << endl;
	return 0;
}

输出

this is first string,this is second string
this is thrid string

序列化与反序列化

模拟微信的信息发送

struct chatinfo
{
	string name;  //用户姓名
	int id;		//用户ID
	Date date; //发送日期
	string mgs; //发送内容
};
int main()
{
	chatinfo info = { "张三",1111111,{2022,10,12},"你在干嘛?" };
	//转换为字符串
	ostringstream oss;
	oss << info.name << " " << info.id << " " << info.date << " " << info.mgs;
	string s;
	s = oss.str();
	cout << s << endl;
	chatinfo chinfo;
	istringstream iss(s);
	iss >> chinfo.name >> chinfo.id >> chinfo.date >> chinfo.mgs;
	cout << "-----------------------------------------" << endl;
	cout << chinfo.name << " " << "(" << chinfo.id << ")" << "[" << chinfo.date << "]" << endl;
	cout << chinfo.mgs << endl;
	return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

影中人lx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值