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

         一篇文章的标题该怎么选择?我个人觉得没有多少什么好的想法。今天选择这个标题是因为自己曾经加入一个讨论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,它速度快的地方就在这里。关于准确的速度的测试,这里我引用一篇文章,http://www.cnblogs.com/chuncn/archive/2009/04/15/1427661.html

下面是测试结果:


©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值