#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
using namespace std;
//二进制文件操作
class Person
{
public:
Person()
{
}
Person(int id, int age)
{
this->id = id;
this->age = age;
}
void show()
{
cout << "id = " << id << endl;
cout << "age = " << age << endl;
}
private:
int id;
int age;
};
int main()
{
//我们把对象p1和p2写进文件里,p1和p2本质是存储在内存中的二进制,因此写入文件里就相当于写二进制数据进文件
//把对象写进文件的操作称为对象序列化
Person p1(10, 20);
Person p2(30, 40);
//我们用文本模式去读文件时,默认把一行末尾的\r去掉,只留\n
//用二进制的方式读写
ofstream osm("C:\\Users\\ts\\Desktop\\target.txt", ios::out | ios::binary);
//写二进制时,则不能再直接用<<输入到文件了,<<操作符适用于基础类型,对于自定义的类,需要使用write方法,具体使用见下面一段代码
osm.write((char *)&p1, sizeof(p1));//把p1的地址强转为char *类型,再计算p1的长度
osm.write((char *)&p2, sizeof(p2));
osm.close();
Person p3;
Person p4;
ifstream ism("C:\\Users\\ts\\Desktop\\source.txt", ios::in | ios::binary);
ism.read((char *)&p3, sizeof(p3));//从文件读取p1的数据,并写进p3的空间
ism.read((char *)&p4, sizeof(p4));//因为这是同一个对象ism即同一个流,读取时是自动定位到读取之后第一个数据,因此连续读取时,不是读同一块数据,而是一直往后读
p3.show();
p4.show();
return 0;
}