|
VC++MFC在UNICODE下,将VECTOR结构体写入到二进制文件中,并读取
在VC++ MFC中,将一个包含结构体的 `std::vector` 写入到二进制文件中并读取的过程如下。我们将定义一个简单的结构体,使用 `std::vector` 存储多个结构体实例,并实现写入和读取的功能。
### 示例代码
- #include <afx.h>
- #include <vector>
- #include <iostream>
- #include <fstream>
- // 定义一个结构体
- struct MyStruct {
- int id;
- CString name;
- // 构造函数
- MyStruct(int id, CString name) : id(id), name(name) {}
- };
- // 将结构体写入二进制文件
- void WriteToBinaryFile(const std::vector<MyStruct>& myStructs, const CString& filePath) {
- CFile file;
- if (!file.Open(filePath, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary)) {
- std::cerr << "无法打开文件进行写入: " << filePath.GetString() << std::endl;
- return;
- }
- // 写入结构体数量
- int count = static_cast<int>(myStructs.size());
- file.Write(&count, sizeof(count));
- // 写入每个结构体
- for (const auto& item : myStructs) {
- // 写入id
- file.Write(&item.id, sizeof(item.id));
- // 写入name的长度
- int nameLength = item.name.GetLength();
- file.Write(&nameLength, sizeof(nameLength));
- // 写入name的内容
- file.Write(item.name.GetString(), nameLength * sizeof(TCHAR));
- }
- file.Close();
- }
- // 从二进制文件读取结构体
- void ReadFromBinaryFile(std::vector<MyStruct>& myStructs, const CString& filePath) {
- CFile file;
- if (!file.Open(filePath, CFile::modeRead | CFile::typeBinary)) {
- std::cerr << "无法打开文件进行读取: " << filePath.GetString() << std::endl;
- return;
- }
- // 读取结构体数量
- int count = 0;
- file.Read(&count, sizeof(count));
- // 读取每个结构体
- for (int i = 0; i < count; ++i) {
- MyStruct item(0, _T("")); // 创建一个临时结构体
- // 读取id
- file.Read(&item.id, sizeof(item.id));
- // 读取name的长度
- int nameLength = 0;
- file.Read(&nameLength, sizeof(nameLength));
- // 读取name的内容
- TCHAR* nameBuffer = new TCHAR[nameLength + 1];
- file.Read(nameBuffer, nameLength * sizeof(TCHAR));
- nameBuffer[nameLength] = _T('\0'); // 添加字符串结束符
- item.name = nameBuffer; // 将读取的内容赋值给name
- delete[] nameBuffer; // 释放临时缓冲区
- myStructs.push_back(item); // 将结构体添加到vector中
- }
- file.Close();
- }
- int main() {
- // 创建一个结构体的向量
- std::vector<MyStruct> myStructs;
- myStructs.emplace_back(1, _T("Alice"));
- myStructs.emplace_back(2, _T("Bob"));
- myStructs.emplace_back(3, _T("Charlie"));
- // 写入到二进制文件
- CString filePath = _T("data.bin");
- WriteToBinaryFile(myStructs, filePath);
- // 清空vector并从文件读取数据
- myStructs.clear();
- ReadFromBinaryFile(myStructs, filePath);
- // 输出读取的数据
- for (const auto& item : myStructs) {
- std::wcout << L"ID: " << item.id << L", Name: " << item.name.GetString() << std::endl;
- }
- return 0;
- }
复制代码
### 代码说明
1. **结构体定义**:定义了一个名为 `MyStruct` 的结构体,包含一个整数 `id` 和一个 `CString` 类型的 `name` 。
2. **写入二进制文件**:
- `WriteToBinaryFile` 函数接受一个 `std::vector<MyStruct>` 和文件路径作为参数。
- 首先写入结构体的数量,然后逐个写入每个结构体的 `id` 和 `name` 。在写入 `name` 之前,先写入其长度,以便在读取时能够正确处理。
3. **读取二进制文件**:
- `ReadFromBinaryFile` 函数从指定的二进制文件读取数据,并将其填充到 `std::vector<MyStruct>` 中。
- 读取结构体的数量,然后逐个读取 `id` 和 `name` ,并将其添加到向量中。
4. ** `main` 函数**:
- 创建并填充 `myStructs` 向量。
- 调用 `WriteToBinaryFile` 将数据写入文件。
- 清空向量并调用 `ReadFromBinaryFile` 从文件中读取数据。
- 输出读取的数据。
### 注意事项
- 确保在项目中正确配置 MFC 和 Unicode 设置。
- 处理文件时要注意错误处理,以确保程序的健壮性。
- 在读取 `name` 时,动态分配了内存,使用完后需要释放,以避免内存泄漏。
|
|