您的位置:首页 > 其它

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

2015-08-10 22:18 337 查看
一篇文章的标题该怎么选择?我个人觉得没有多少什么好的想法。今天选择这个标题是因为自己曾经加入一个讨论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);//创建文件,与普通打开文件相同,可使用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

下面是测试结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: