用C++内存映射,从超大的数据文件中查找某个指定的字符串key,并将文件中包含key的行的数据都显示在界面上 100

HANDLEhFile=CreateFile(m_FilePath,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FIL... HANDLE hFile = CreateFile(m_FilePath, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
TRACE("Error:%drn", GetLastError());
return;
}
HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
if (hFileMap == NULL)
{
TRACE("Error:%drn", GetLastError());
return;
}
// 得到系统分配粒度
SYSTEM_INFO SysInfo;
GetSystemInfo(&SysInfo);
DWORD dwGran = SysInfo.dwAllocationGranularity;//一般是65536(byte)=64KB
DWORD dwFileSizeHigh;
__int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
qwFileSize |= (((__int64)dwFileSizeHigh) << 32);
CloseHandle(hFile);
__int64 qwFileOffset = 0;
DWORD dwBlockBytes = 1000 * dwGran;
if (qwFileSize < 1000 * dwGran)
dwBlockBytes = (DWORD)qwFileSize;
while (qwFileOffset >= 0)
{
LPBYTE lpbMapAddress = (LPBYTE)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,
(DWORD)(qwFileOffset >> 32), (DWORD)(qwFileOffset & 0xFFFFFFFF),
dwBlockBytes);
if (lpbMapAddress == NULL)
{
TRACE("Error:%drn", GetLastError());
return;
}
//该函数如何书写呢?从lpbMapAddress所指向的内存地址中搜索所有给定的关键字:keyword
//并返回关键字keyword所在那一行的数据
UnmapViewOfFile(lpbMapAddress);
qwFileOffset += dwBlockBytes;
qwFileSize -= dwBlockBytes;
}
CloseHandle(hFileMap);
展开
 我来答
wyujack
2015-04-22 · TA获得超过223个赞
知道小有建树答主
回答量:303
采纳率:0%
帮助的人:178万
展开全部
// 给出一个思路,仅供参考
// 1. 依次遍历找到文件中的指定关键字的位置 可用用memcmp 进行比较
// 2. 根据协议(写数据时的格式)将指定长度的数据读取来(还有行的概念吗?)
//  3.  输出数据到屏幕上
匿名用户
2015-04-22
展开全部
然后用mapping弄。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2015-04-22
展开全部
既然要指定行了,那不给hint优化的随机访问映射也没有多少用了,照样得从头读。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式