zoukankan      html  css  js  c++  java
  • 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#中将IP地址转换成无符号整形数的方法与逆变换方法
    中英文字符的截取
    c#读取并分析sql Server2005数据库日志
    枚举enum使用
    LINQ to XML 编程基础
    c#异步调用的几种方式
    File,FileInfo,FileStream,StreamReader的区别与用法
    Page.ClientScript.RegisterStartupScript用法小结
    asp.net图片上传及删除
    FileUpload控件
  • 原文地址:https://www.cnblogs.com/yukaizhao/p/memorymapfile_struct.html
Copyright © 2011-2022 走看看