C++ 将 vector 对象序列化为二进制文件
以下是将 vector 对象序列化为二进制文件的 C++ 代码示例:
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
struct MyData {
int id;
string name;
double score;
};
// 将 vector 对象序列化为二进制文件
void serialize(const vector<MyData>& data, const string& filename) {
ofstream ofs(filename, ios::binary);
if (ofs) {
int size = data.size(); // 获取 vector 对象的大小
ofs.write(reinterpret_cast<const char*>(&size), sizeof(size)); // 写入 vector 对象的大小
for (const auto& d : data) {
ofs.write(reinterpret_cast<const char*>(&d.id), sizeof(d.id)); // 写入 id
int len = d.name.size(); // 获取 name 字符串的长度
ofs.write(reinterpret_cast<const char*>(&len), sizeof(len)); // 写入 name 字符串的长度
ofs.write(d.name.data(), len); // 写入 name 字符串的内容
ofs.write(reinterpret_cast<const char*>(&d.score), sizeof(d.score)); // 写入 score
}
}
ofs.close();
}
// 从二进制文件中反序列化出 vector 对象
vector<MyData> deserialize(const string& filename) {
vector<MyData> data;
ifstream ifs(filename, ios::binary);
if (ifs) {
int size;
ifs.read(reinterpret_cast<char*>(&size), sizeof(size)); // 读取 vector 对象的大小
for (int i = 0; i < size; ++i) {
MyData d;
ifs.read(reinterpret_cast<char*>(&d.id), sizeof(d.id)); // 读取 id
int len;
ifs.read(reinterpret_cast<char*>(&len), sizeof(len)); // 读取 name 字符串的长度
d.name.resize(len); // 为 name 字符串分配空间
ifs.read(&d.name[0], len); // 读取 name 字符串的内容
ifs.read(reinterpret_cast<char*>(&d.score), sizeof(d.score)); // 读取 score
data.push_back(d);
}
}
ifs.close();
return data;
}
int main() {
vector<MyData> data = { {1, 'Alice', 90.5}, {2, 'Bob', 85.0}, {3, 'Charlie', 70.5} };
serialize(data, 'data.bin');
vector<MyData> loaded_data = deserialize('data.bin');
for (const auto& d : loaded_data) {
cout << d.id << ' ' << d.name << ' ' << d.score << endl;
}
return 0;
}
该代码使用 ofstream 和 ifstream 类分别实现了将 vector 对象序列化为二进制文件和从二进制文件中反序列化出 vector 对象的功能。在序列化时,我们首先将 vector 对象的大小写入文件,然后逐个写入 vector 中的元素。对于 MyData 结构体中的字符串 name,我们先写入它的长度,然后再写入它的内容。在反序列化时,我们先读取 vector 对象的大小,然后逐个读取 vector 中的元素。对于字符串 name,我们先读取它的长度,然后为它分配空间,再读取它的内容。最后,我们将反序列化出的 vector 对象输出到控制台上。
通过以上代码,你可以轻松实现将 vector 对象序列化为二进制文件,并从文件中恢复数据。这在数据存储、网络传输等场景中非常有用。
原文地址: https://www.cveoy.top/t/topic/l2TE 著作权归作者所有。请勿转载和采集!