快速的将一个结构体写入文件--内存映射文件

来源:互联网 发布:淘宝上ios充值的原理 编辑:程序博客网 时间:2024/06/11 03:24

         一篇文章的标题该怎么选择?我个人觉得没有多少什么好的想法。今天选择这个标题是因为自己曾经加入一个讨论c++的QQ群(现在已经被我退群了,有种想再加入的冲动),有人问到怎么样将一个结构体快速的从文件进行读写,那时自己的想法就是打开文件-》读入缓存-》从缓存中读取,虽然觉得这个方法很笨,但是自己也没有好的办法。然而,就在刚才自己在学习面试宝典的过程中,发现了内在映射文件技术。这当然是一个很有历史的技术,然而由于自己比较水,致使自己到现在才了解到它,为自己感到惋惜。就在看到这个技术的一刻,突然想起了群里人问起的问题的,我相信这个技术已经是最好的解答了。

        不多废话,现在开始。

        内存映射文件的原理很简单,百度一大堆,它与虚拟内存的原理很相似,就是把硬盘上的一块区域当作内存来使用,这样做的好处就是我们可以直接对文件进行io操作,而不是传统的文件-》内存-》文件式操作。速度快是它的优点。

        下面来看一例子,它将一个结构体直接写入到test.txt文件中,而且下次可以直接调用。

#include <wtypes.h>#include <windows.h>#include <stdio.h>struct stu{double d;int i;char c;};stu s;BOOL FileMapping(PCTSTR pszPathName){HANDLE hFile = CreateFile(pszPathName, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);//创建文件,与普通打开文件相同,可使用fopenif (hFile == INVALID_HANDLE_VALUE){printf("File could not be opened.");return FALSE;}DWORD dwFileSize = sizeof(stu);HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0,dwFileSize, NULL);//创建内存映射文件if (hFileMap == NULL){CloseHandle(hFile);return FALSE;}PVOID pvFile = MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, 0, 0);//可以理解为获取文件在硬盘上的地址if (pvFile == NULL){CloseHandle(hFileMap);CloseHandle(hFile);return FALSE;}PSTR pchAnsi = (PSTR)pvFile;memcpy(pchAnsi, (char*)&s, dwFileSize);//内存拷贝stu temp = *(stu*)pchAnsi;UnmapViewOfFile(pvFile);CloseHandle(hFileMap);CloseHandle(hFile);return TRUE;}int main(){s.i = 1;s.c = 'a';s.d = 1.25000;FileMapping("test.txt");}
可以看到上面的程序没有使用file.read与file.write,它速度快的地方就在这里。关于准确的速度的测试,这里我引用一篇文章,http://www.cnblogs.com/chuncn/archive/2009/04/15/1427661.html

下面是测试结果:


0 0