|
VC++ ATL中读写二进制数据文件
在VC++ ATL中读写二进制数据文件可以使用CAtlFile类或标准C++文件流实现。以下是几种常见实现方式: BinaryFile.cpp
- #include <atlfile.h>
- #include <atlstr.h>
- void WriteBinaryData(const CString& filePath, const void* data, size_t size)
- {
- CAtlFile file;
- if (SUCCEEDED(file.Create(filePath, GENERIC_WRITE, FILE_SHARE_READ, CREATE_ALWAYS)))
- {
- DWORD dwWritten = 0;
- file.Write(data, static_cast<DWORD>(size), dwWritten);
- file.Close();
- }
- }
复制代码
适合写入结构体或固定大小的二进制数据27。 BinaryStream.cpp
- <fstream>
- bool ReadBinaryFile(const std::wstring& path, std::vector<char>& buffer)
- {
- std::ifstream file(path, std::ios::binary | std::ios::ate);
- if (!file) return false;
-
- std::streamsize size = file.tellg();
- file.seekg(0, std::ios::beg);
- buffer.resize(size);
- return file.read(buffer.data(), size).good();
- }
- bool WriteBinaryFile(const std::wstring& path, const void* data, size_t size)
- {
- std::ofstream file(path, std::ios::binary);
- if (!file) return false;
- file.write(static_cast<const char*>(data), size);
- return file.good();
- }
复制代码
这种方法更适合处理动态大小的二进制数据57。 StructIO.cpp
- struct AccountInfo {
- int id;
- char name[32];
- double balance;
- };
- void SaveAccount(const CString& path, const AccountInfo& info)
- {
- CAtlFile file;
- if (SUCCEEDED(file.Create(path, GENERIC_WRITE, FILE_SHARE_READ, CREATE_ALWAYS)))
- {
- DWORD written;
- file.Write(&info, sizeof(AccountInfo), written);
- }
- }
复制代码
这种方式直接映射内存布局到文件,效率最高27。 注意事项: - 二进制文件读写需要考虑字节序问题7
- 大文件建议分块读写提高效率5
- 写入字符串时建议明确长度避免截断1
- 文件打开后必须检查是否成功
|
|