|
使用VC++ ATL将结构体数组写入文件并读取的完整实现方案
该实现包含完整的错误处理,先写入数组长度再写入数据,确保读取时可以正确分配内存。使用时注意内存管理,读取后需要手动释放数组内存。
StructArrayIO.h
- #pragma once
- #include <atlfile.h>
- #include <atlstr.h>
- // 示例结构体
- struct AccountInfo {
- int id;
- char username[32];
- double balance;
- bool isActive;
- };
复制代码 StructArrayIO.cpp
- #include "StructArrayIO.h"
- // 写入结构体数组到文件
- bool WriteStructArray(const CString& filePath, const AccountInfo* data, int count) {
- CAtlFile file;
- if (FAILED(file.Create(filePath, GENERIC_WRITE, FILE_SHARE_READ, CREATE_ALWAYS))) {
- return false;
- }
- // 先写入数组长度
- DWORD bytesWritten = 0;
- if (FAILED(file.Write(&count, sizeof(int), bytesWritten))) {
- file.Close();
- return false;
- }
- // 写入数组数据
- HRESULT hr = file.Write(data, sizeof(AccountInfo) * count, bytesWritten);
- file.Close();
-
- return SUCCEEDED(hr);
- }
- // 从文件读取结构体数组
- bool ReadStructArray(const CString& filePath, AccountInfo*& outData, int& outCount) {
- CAtlFile file;
- if (FAILED(file.Create(filePath, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING))) {
- return false;
- }
- // 读取数组长度
- DWORD bytesRead = 0;
- if (FAILED(file.Read(&outCount, sizeof(int), bytesRead))) {
- file.Close();
- return false;
- }
- // 分配内存
- outData = new AccountInfo[outCount];
-
- // 读取数组数据
- HRESULT hr = file.Read(outData, sizeof(AccountInfo) * outCount, bytesRead);
- file.Close();
-
- if (FAILED(hr)) {
- delete[] outData;
- return false;
- }
- return true;
- }
- // 使用示例
- void ExampleUsage() {
- AccountInfo accounts[3] = {
- {1001, "user1", 1000.0, true},
- {1002, "user2", 2000.0, false},
- {1003, "user3", 3000.0, true}
- };
- CString filePath = L"C:\\temp\\accounts.dat";
-
- // 写入示例
- if (WriteStructArray(filePath, accounts, 3)) {
- // 读取示例
- AccountInfo* loadedAccounts = nullptr;
- int count = 0;
- if (ReadStructArray(filePath, loadedAccounts, count)) {
- // 使用读取的数据...
- delete[] loadedAccounts; // 记得释放内存
- }
- }
- }
复制代码
|
|