#include
#include
#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;
}
}
|