C++中使用内存映射文件存取struct,并用指针访问
#include <iostream> #include <Windows.h> #define OK 0 #define MMF_FILE_SIZE (1024*512) const char * mmf_file_name = "d:\\mmf.txt" ; const char * mmf_share_name = "testmmf" ; //定义内存映射文件相关的全局变量 HANDLE file_handle = NULL; HANDLE mfile_handle = NULL; void * mview_ptr = NULL; //打开内存映射文件和映射视图 int open_mmf(); //关闭内存映射文件相关资源 void close_mmf(); //定义指针 struct Foo{ unsigned int id; char code[30]; char name[30]; }; using namespace std; int main(){ int open_status = open_mmf(); if (open_status){ cout<< "打开内存映射文件出错,错误号:" <<open_status<<endl; } else { cout<< "成功打开了内存映射文件" <<endl; Foo* foo_ptr = (Foo*)mview_ptr; Foo foo; const size_t foo_size = sizeof (Foo); int count = MMF_FILE_SIZE / foo_size - 1; for ( int i=0;i<=count;i++){ foo.id = i+1; sprintf (foo.name, "+%d" ,foo.id); sprintf (foo.code, "-%d" ,foo.id); memcpy (foo_ptr+i,&foo,foo_size); printf ( "copy %d\r" ,i); } cout<< "保存数据完毕" <<endl; cout<< "尝试读取数据" <<endl; for ( int i=0;i<=count;i++){ foo = *(foo_ptr+i); cout<< "foo:" <<foo.id<< "," <<foo.code<< "," <<foo.name<<endl; } cout<< "读取数据完毕" <<endl; } system ( "pause" ); close_mmf(); return EXIT_SUCCESS; } //打开内存映射文件 int open_mmf(){ file_handle = CreateFile(mmf_file_name, GENERIC_ALL, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (INVALID_HANDLE_VALUE == file_handle){ return GetLastError(); } mfile_handle = CreateFileMapping(file_handle, NULL, PAGE_READWRITE, 0, MMF_FILE_SIZE, mmf_share_name); if (INVALID_HANDLE_VALUE == mfile_handle){ return GetLastError(); } mview_ptr = MapViewOfFile(mfile_handle, FILE_MAP_ALL_ACCESS, 0, 0, MMF_FILE_SIZE); return OK; } //释放内存映射文件占用的资源。 void close_mmf(){ if (NULL != mview_ptr){ UnmapViewOfFile(mview_ptr); mview_ptr = NULL; } if (NULL != mfile_handle){ CloseHandle(mfile_handle); mfile_handle = NULL; } if (NULL != file_handle){ CloseHandle(file_handle); file_handle = NULL; } } |
分类:
C++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2010-05-19 LINQ to SQL 系列五 grouping having