快速的将一个结构体写入文件--内存映射文件
来源:互联网 发布:淘宝上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
- 快速的将一个结构体写入文件--内存映射文件
- 将结构体按位写入文件
- 内存映射,快速读写文件
- 将一个文件的内容写入到另一个文件
- 文件的内存映射
- 文件的内存映射
- 映射内存的文件
- 将文件写入内存后解
- 将资源文件写入内存数据段
- 如何将一个文件夹内的文件写入txt中
- 对一个文件使用内存映射文件
- 对一个文件使用内存映射文件
- 对一个文件使用内存映射文件
- file_put_contents -- 将一个字符串写入文件
- 将一个目录写入复合文件
- 将数据写入一个XML文件
- 怎么将一个整个文件一次读到内存,然后循环从内存中读取1024字节,写入新的文件(或socket发送出去)
- mmap方法将文件映射到内存
- Apache OFbiz MiniLang 源码解读
- 将XML文件转化成NSData对象
- 浅谈Eclipse快捷键的使用方法及调试小技巧
- hdu 1133 Buy the Ticket(卡特兰数)
- 数据结构(Java语言)——ArrayList简单实现
- 快速的将一个结构体写入文件--内存映射文件
- HDU 4767( china + 矩阵快速幂)
- STL(3)---<vector>
- JS对象继承
- 用过滤器过滤全站非法字符
- JAVA 基础数据大小
- kmp(第二次个人赛)*(重复次数->长度最长)
- 最大似然估计
- 【JavaScript】--正则表达式