|  | 
 
| 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`  时,动态分配了内存,使用完后需要释放,以避免内存泄漏。
 
 
 | 
 |