c++对象数组保存文件读取文件代码
以下是一个简单的例子,展示如何在C++中保存和读取对象数组:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
// 定义一个简单的Person类
class Person {
public:
string name;
int age;
Person() {}
Person(string name, int age) {
this->name = name;
this->age = age;
}
// 重载输出运算符,方便输出对象信息
friend ostream& operator<<(ostream& os, const Person& person) {
os << "Name: " << person.name << ", Age: " << person.age;
return os;
}
};
// 保存Person对象数组到文件
void save_persons(Person* persons, int size, const string& file_name) {
ofstream ofs(file_name, ios::binary);
if (ofs) {
ofs.write((char*)&size, sizeof(int)); // 先写入数组大小
ofs.write((char*)persons, sizeof(Person) * size); // 再写入对象数组
ofs.close();
cout << "Save persons to file success." << endl;
} else {
cout << "Cannot open file: " << file_name << endl;
}
}
// 从文件读取Person对象数组
Person* load_persons(int& size, const string& file_name) {
ifstream ifs(file_name, ios::binary);
if (ifs) {
ifs.read((char*)&size, sizeof(int)); // 先读取数组大小
Person* persons = new Person[size]; // 创建对象数组
ifs.read((char*)persons, sizeof(Person) * size); // 读取对象数组
ifs.close();
cout << "Load persons from file success." << endl;
return persons;
} else {
cout << "Cannot open file: " << file_name << endl;
return nullptr;
}
}
int main() {
// 创建Person对象数组
Person persons[] = {
Person("Tom", 20),
Person("Jerry", 18),
Person("Alice", 22)
};
int size = sizeof(persons) / sizeof(Person);
// 保存对象数组到文件
save_persons(persons, size, "persons.dat");
// 从文件读取对象数组
Person* loaded_persons = load_persons(size, "persons.dat");
for (int i = 0; i < size; i++) {
cout << loaded_persons[i] << endl;
}
delete[] loaded_persons;
return 0;
}
在上面的例子中,我们定义了一个简单的Person类,包含姓名和年龄两个属性。我们使用save_persons函数将Person对象数组保存到文件中,使用load_persons函数从文件中读取Person对象数组。在保存对象数组时,我们先写入数组大小,再写入对象数组;在读取对象数组时,我们先读取数组大小,再创建对象数组,最后读取对象数组。
需要注意的是,在保存和读取对象数组时,我们使用了二进制文件。这意味着我们需要对对象进行序列化和反序列化,即将对象转换为字节流,再从字节流恢复为对象。在本例中,我们没有对Person对象进行序列化和反序列化,而是直接将对象的内存数据写入文件中。这种做法并不安全,因为对象的内存布局可能会随着编译器和操作系统的不同而变化。在实际开发中,我们应该使用序列化库,如Google的Protocol Buffers,来进行对象的序列化和反序列化
原文地址: https://www.cveoy.top/t/topic/giLn 著作权归作者所有。请勿转载和采集!