《C++避坑神器·七》二进制读写自定义类型导致崩溃或数据读写不全问题

本文讨论了如何在二进制模式下使用ofstream和ifstream对自定义数据类型如Person进行读写,指出使用char数组存储字符串的原因,避免因内存占用和数据完整性问题导致的错误。

概要

二进制读写不仅可以对普通数据类型进行读写,也能对自定义数据类型进行读写,同时对自定义数据类型的读写容易导致读写崩溃或数据不全问题。

技术细节

1、二进制写文件
ofstream ofs; //创建流对象
ofs.open(“文件路径”, 打开方式); //打开文件并判断文件是否打开成功
ofs.write(const char *buffer, int len); //写数据,len表示buffer总字节数
ofs.close() //关闭文件

class Person
{
public:
	Person(const char name[], int age)
	{
		strcpy_s(this->name, name);
		this->age = age;
	}

	char name[30]; //字符串不能用char*或者string类型存放
	int age;
};

int main()
{
	//创建流对象并打开文件
	ofstream ofs("D:\\test.txt", ios::binary|ios::out);
	//判断文件是否打开成功
	if (!ofs.is_open())
	{
		cout << "文件打开失败!" << endl;
		return 0;
	}
	//写数据
	Person p("张三", 20);
	ofs.write((const char*)&p, sizeof(Person)); //强转const char*
	//关闭文件
	ofs.close();
}

2、二进制读文件
read(char *buffer, int len) //len为buffer总字节数

class Person
{
public:
	char name[30]; //字符串不能用char*或者string类型存放
	int age;
};

int main()
{
	//创建流对象并打开文件
	ifstream ifs("D:\\test.txt", ios::binary|ios::in);
	//判断文件是否打开成功
	if (!ifs.is_open())
	{
		cout << "文件打开失败!" << endl;
		return 0;
	}
	//读数据
	Person p;
	ifs.read((char*)&p, sizeof(Person));
	cout << p.name << " " << p.age << endl; //张三,20
	//关闭文件
	ifs.close();
}

小结

二进制读写成员变量的字符串为啥不设为string或char *类型,拿char 举例,char 指向一个字符串地址,假设这个字符串内容占10个字节,写到文本后内容是占10个字节的,在读取的时候sizeof(Person)不是10个字节,而是四个字节(指针占四个字节),这样的话10个字节的内容就读不全,那输出char内容可能就是乱码或者错误的结果。string类仅有一个数据成员,char指针,故string类的大小和指针相似,所以最好采取char name[]的字符数组形式。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梦回阑珊

一毛不嫌多,一分也是爱

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

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

打赏作者

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

抵扣说明:

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

余额充值