C++使用内存映射文件入门

本文介绍如何使用CreateFileMapping,MapViewOfFile创建内存映射文件,如何向内存映射文件中写入数据,读取数据。

#include <iostream>
#include <assert.h>
 
#include <Windows.h>
#include <WinBase.h>
 
#define BAD_POS 0xFFFFFFFF // returned by SetFilePointer and GetFileSize
#define SUCCESS 0
using  namespace  std;
 
 
typedef  DWORD  mmf_share_mode;
typedef  DWORD  mmf_access_mode;
typedef  DWORD  mmf_flags;
 
 
int  main(){
     cout<< "create memorymapfile..." <<endl;
     const  char * shared_name = "testMmf" ;
     const  char * file_name = "d:\\testMmf.mmf" ;
     const  DWORD  mmf_size = 512*1024;
     //存取模式
     mmf_access_mode access_mode = (GENERIC_READ|GENERIC_WRITE);
     //共享模式
     mmf_share_mode share_mode = FILE_SHARE_READ | FILE_SHARE_WRITE;
     //文件属性
     mmf_flags flags = FILE_FLAG_SEQUENTIAL_SCAN; //|FILE_FLAG_WRITE_THROUGH|FILE_FLAG_NO_BUFFERING;
     DWORD  error_code;
     
     //创建文件
     HANDLE  mmHandle =
         CreateFile(file_name,
              access_mode,
              share_mode,
              NULL,
              OPEN_ALWAYS,
              flags,
              NULL);
 
     if  (mmHandle == INVALID_HANDLE_VALUE) {
         error_code = GetLastError();
         cout<< "创建mmf失败:" <<error_code<<endl;
     } else {
         DWORD  high_size;
         DWORD  file_size = GetFileSize(mmHandle, &high_size);
         if  (file_size == BAD_POS && (error_code = GetLastError()) != SUCCESS) {
             CloseHandle(mmHandle);           
             cout<< "error:" <<error_code<<endl;
         }
         cout<< "create mmf sucessfully" <<endl;
 
         //assert(file_size == 0);
 
         DWORD  size_high = 0;
         //创建文件映射,如果要创建内存页面文件的映射,第一个参数设置为INVALID_HANDLE_VALUE
         HANDLE  mmfm = CreateFileMapping(mmHandle,
             NULL,
             PAGE_READWRITE,
             size_high,
             mmf_size,
             shared_name);
 
         error_code = GetLastError();
         if (SUCCESS != error_code){
             cout<< "createFileMapping error" <<error_code<<endl;
         } else {
             if (mmfm == NULL){
                 if (mmHandle != INVALID_HANDLE_VALUE){
                     CloseHandle(mmHandle);
                 }
             } else {
                 //char write_chars[] = "hello chars";
                 //size_t position = 0;
                 //DWORD written = 0;
                 //const size_t write_chars_size = sizeof(write_chars);
                 //WriteFile(mmHandle,write_chars,write_chars_size,&written,NULL);
                 size_t  view_size = 1024*256;
                 DWORD  view_access = FILE_MAP_ALL_ACCESS;
 
                 //获得映射视图
                 char * mmfm_base_address = ( char *)MapViewOfFile(mmfm,view_access,0,0,view_size);
                 if (mmfm_base_address == NULL){
                     error_code = GetLastError();
                     if (error_code != SUCCESS){
                         cout<< "error code " <<error_code<<endl;
                     }
                 } else {
                     char  write_chars[] = "hello chars" ;
                     const  size_t  write_chars_size = sizeof (write_chars);
                     //向内存映射视图中写数据
                     CopyMemory(( PVOID )mmfm_base_address, write_chars, write_chars_size);
 
                     //memcpy(mmfm_base_address,write_chars,write_chars_size);
                     
                     size_t  position = 0;
                     char  read_chars[write_chars_size];
 
                     //读数据
                     memcpy (read_chars,mmfm_base_address,write_chars_size);
                     cout<< "read chars " <<read_chars<<endl;
                     
                     //卸载映射
                     UnmapViewOfFile(mmfm_base_address);
                     //关闭内存映射文件
                     CloseHandle(mmfm);
                     //关闭文件
                     CloseHandle(mmHandle);
                 }
             }
         }
     }
 
     
 
     system ( "pause" );
     exit (0);
     return  EXIT_SUCCESS;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值