快速的将一个结构体写入文件--内存映射文件
2015-08-10 22:18
337 查看
一篇文章的标题该怎么选择?我个人觉得没有多少什么好的想法。今天选择这个标题是因为自己曾经加入一个讨论c++的QQ群(现在已经被我退群了,有种想再加入的冲动),有人问到怎么样将一个结构体快速的从文件进行读写,那时自己的想法就是打开文件-》读入缓存-》从缓存中读取,虽然觉得这个方法很笨,但是自己也没有好的办法。然而,就在刚才自己在学习面试宝典的过程中,发现了内在映射文件技术。这当然是一个很有历史的技术,然而由于自己比较水,致使自己到现在才了解到它,为自己感到惋惜。就在看到这个技术的一刻,突然想起了群里人问起的问题的,我相信这个技术已经是最好的解答了。
不多废话,现在开始。
内存映射文件的原理很简单,百度一大堆,它与虚拟内存的原理很相似,就是把硬盘上的一块区域当作内存来使用,这样做的好处就是我们可以直接对文件进行io操作,而不是传统的文件-》内存-》文件式操作。速度快是它的优点。
下面来看一例子,它将一个结构体直接写入到test.txt文件中,而且下次可以直接调用。
下面是测试结果:
不多废话,现在开始。
内存映射文件的原理很简单,百度一大堆,它与虚拟内存的原理很相似,就是把硬盘上的一块区域当作内存来使用,这样做的好处就是我们可以直接对文件进行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);//创建文件,与普通打开文件相同,可使用fopen if (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,它速度快的地方就在这里。关于准确的速度的测试,这里我引用一篇文章,/article/4788522.html
下面是测试结果:
相关文章推荐
- 2012届华为校园招聘机试题(java实现)
- 面试中经常出现的算法1(整理)
- grunt实践(target,option,task)
- Android测试二----InstrumentationTestRunner运行测试用例机制
- 1145 求图像的周长
- 2015第33周一
- 深入理解计算机操作系统——第3章:数组,异质的数据结构,指针
- iOS 手势识别器
- 为什么覆写equals的时候一定要覆写hashCode?
- web.xml文件的作用
- 基于Twemproxy的Redis集群方案
- Html5(1) html5 与 html4 的区别
- Git 基础知识
- Linux(cent OS)下软件包管理-ip地址配置和网络yum源/yum命令
- 自定义View
- Kth Smallest Element in a BST
- JDBC常用类和接口及增删查修
- KVC与IBOutlet和IBAction初始化
- HDU2.2.2 Joseph
- 剑指offer_面试题17_合并两个排序的链表(两种思维)