请教:在记事本中有几百兆的数据,这些数据都是用于测试的,关键是这几百兆的数据在txt文本都是一行来表示,用ReadString()函数读取相当慢.10兆的数据都得用20分钟.任务很简单:这些数据都是有规律的,每60个一组,相邻两个组作比较.我想能否每次只读取60个,比如第一次读出60个存起来,然后记住当前的位置,第二次从上一次的当前位置接着读60个,记住当前位置也就是120,第三次从第二次结束的位置继续读....直到结束. 但我不知道有什么函数来实现,因为这几百兆的数据都是一行.如何记录每次读60个以后的位置. 还有我在网上看到用内存映射来处理.能否给出一个小例子,小女子非常感谢啦!
解决方案 »
- 如何处理 还在执行任务的线程 退出 这种情况
- 刚开始学就遇到不会搞的了,高手求救VC动态链接库
- 如何捕捉正确的对话框画面 在线等。。。
- 能不能把对话框的底色也做成Office2003的菜单的底色那样????
- 我想做一个支持各种格式的播放器,象media play classic,请问怎么下手,是否可以用网上的这些解码插件?
- 很简单的问题?怎样得到combobox中下拉列表中的内容啊?
- 关于CMainFrame和CView中指针传递。
- 请问如何检测其他程序是否运行?
- 请问想在本窗口成为非活动窗口时做事,该响应什么消息
- 快来帮忙!!!!!
- 关于图像的梯度,难道是 好几本书 都错了?
- 请教:VC#2005代码转VC++ 6.0,逻辑并不复杂
这个应该能够给你一些启发。
[email protected]
{
// Open the file for reading and writing.
HANDLE hFile = CreateFile(pszPathname, GENERIC_READ, 0,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) {
MessageBox(NULL, L"File could not be opened.", L"Msg", MB_OK);
return(FALSE);
} // Get the size of the file (I assume the whole file can be mapped).
DWORD dwFileSize = GetFileSize(hFile, NULL); // 这里把整个文件全部映射,反正只有几百M
// Create the file-mapping object.
HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY,
0, dwFileSize, NULL); if (hFileMap == NULL) {
MessageBox(NULL, L"File map could not be opened.", L"Msg", MB_OK);
CloseHandle(hFile);
return(FALSE);
} // 当下面这句话被调用后,相当于把你的整个文件都放到内存里面去了,然后你就可以做自己想做的事情了
// Get the address where the first byte of the file is mapped into memory.
PVOID pvFile = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0); if (pvFile == NULL) {
MessageBox(NULL, L"Could not map view of file.", L"Msg", MB_OK);
CloseHandle(hFileMap);
CloseHandle(hFile);
return(FALSE);
} // 以下应该就是你的操作了,你可以用那些操作内存函数,比如说memcpy之类的
// SetFilePointer函数用来操作文件指针
while(文件指针没有指向末尾)
{
先读取60个,
再读取60个,
比较,
...
} // Clean up everything before exiting.
UnmapViewOfFile(pvFile);
CloseHandle(hFileMap); SetEndOfFile(hFile);
CloseHandle(hFile); return(TRUE);
}我没有试过,代码是从《windows核心编程(第5版)》的第17章 内存映射文件 上修改的。
这么做应该可以。
呵呵。
不知道有没有误导你。
char a[60], b[60];
while(pvFile!=NULL)
{
memcpy(a,pvFile,60);
memcpy(b,pvFile,60);
比较a,b,
SetFilePointer(pvFile,60,0,FILE_BEGIN );
...
}
while(pvFile!=NULL)
{
memcpy(a,pvFile,60);
memcpy(b,pvFile + 60,60);
比较a,b,
SetFilePointer(pvFile,60,0,FILE_BEGIN );
...
}
{
memcpy(a,pvFile,60);
memcpy(b,pvFile+60,60); //这一行有错!!
// 比较a,b,
SetFilePointer(pvFile,60,0,FILE_BEGIN );
...
} error C2036: 'void *' : unknown size
{
}
这条语句特耽误时间,好像进了一个死循环一样,我尝试了一个1K的文件,看window任务管理器一直在执行。
DWORD
WINAPI
SetFilePointer(
__in HANDLE hFile,
__in LONG lDistanceToMove,
__in_opt PLONG lpDistanceToMoveHigh,
__in DWORD dwMoveMethod
);
hFile是文件句柄。
lDistanceToMove是文件指针距离头或尾的长度。
lpDistanceToMoveHigh是文件指针距离头或尾的长度高位长度。
dwMoveMethod是相对文件头、文件尾或者当前位置的方式。
PBYTE pvFile =(PBYTE) MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0); 这样才能对pvfile指针操作,比较的时候应该:
while(len<=dwFileSize)
{
memcpy(a,pvFile+r,39);
memcpy(b,pvFile+r+39,39);
// 比较a,b,
r= SetFilePointer(hFile,39,0,FILE_CURRENT);
len=len+39;
}