请教:在记事本中有几百兆的数据,这些数据都是用于测试的,关键是这几百兆的数据在txt文本都是一行来表示,用ReadString()函数读取相当慢.10兆的数据都得用20分钟.任务很简单:这些数据都是有规律的,每60个一组,相邻两个组作比较.我想能否每次只读取60个,比如第一次读出60个存起来,然后记住当前的位置,第二次从上一次的当前位置接着读60个,记住当前位置也就是120,第三次从第二次结束的位置继续读....直到结束. 但我不知道有什么函数来实现,因为这几百兆的数据都是一行.如何记录每次读60个以后的位置.还有我在网上看到用内存映射来处理.能否给出一个小例子,小女子非常感谢啦!
fread
fseek
ftell
不过,用一楼的方法也行的!
CFileDialog fileDlg(TRUE, "*.txt", "*.txt", NULL, "文本文件 (*.txt)|*.txt||", this);
fileDlg.m_ofn.Flags |= OFN_FILEMUSTEXIST;
fileDlg.m_ofn.lpstrTitle = "通过内存映射文件读取数据";
if (fileDlg.DoModal() == IDOK)
{
// 创建文件对象
HANDLE hFile = CreateFile(fileDlg.GetPathName(), GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
TRACE("创建文件对象失败,错误代码:%drn", GetLastError());
return;
}
// 创建文件映射对象
HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
if (hFileMap == NULL)
{
TRACE("创建文件映射对象失败,错误代码:%drn", GetLastError());
return;
}
// 得到系统分配粒度
SYSTEM_INFO SysInfo;
GetSystemInfo(&SysInfo);
DWORD dwGran = SysInfo.dwAllocationGranularity;
// 得到文件尺寸
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("映射文件映射失败,错误代码:%drn", GetLastError());
return;
}
// 对映射的视图进行访问
for(DWORD i = 0; i < dwBlockBytes; i++)
BYTE temp = *(lpbMapAddress + i);
// 撤消文件映像
UnmapViewOfFile(lpbMapAddress);
// 修正参数
qwFileOffset += dwBlockBytes;
qwFileSize -= dwBlockBytes;
}
// 关闭文件映射对象句柄
CloseHandle(hFileMap);
AfxMessageBox("成功完成对文件的访问");
}
fread(buffer,60,500*1024*1024/60,fp)? 对么?这个buffer只要定义60就可以了吧?
for(i=0;i<500*1024*1024/120;i++)
{
fread(buffer1,60,1,fp);
fread(buffer2,60,1,fp);
buffer1[60]与buffer2[60]作比较;}
这样就对了吧? 还有这么做的速度如何?500MB的数据大概多长时间?
CreateFile
CreateFileMapping
MapViewOfFile
把MapViewOfFile返回的指针作为字符串指针,根据你的要求加上偏移量(比如60的倍数)就可以访问每个单独的数据,后面就直接用strncmp等字符串比较函数处理。