急切求教超大文件的读写解决办法

急切求教超大文件的读写
超过4G以上的大文件,用常规方式读取就不行了,这两天查了下,
主要用:createFileMapping和mapviewofFile进行读,请问这两个函数该如果具体操作呢?
还有就是我如果想把文件里面我想要的某行,提取出来,该用那个函数储存呢?
比如我要第1行,第3行,每读到一行想要的,该如何储存在我另外一个文本中呢?

------解决方案--------------------
CreateFile打开一个文件,把文件句柄交给CreateFileMapping建立一个映射对象。
通过映射对象可以调用MapViewOfFile把文件映射到内存地址上,这样你就可以通过访问内存直接读到文件的数据。

直接用ReadFile一样可以读超过4G的文件,除非你的文件系统不支持超过4G的文件。file mapping的好处仅仅在于如果你需要随机读取文件内容通过file mapping可以直接使用Windows系统的虚拟内存缓冲机制。
------解决方案--------------------
C/C++ code

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

int _tmain(int argc, _TCHAR *argv[])
{
HANDLE hFile;
HANDLE hFMap;
hFile = CreateFile(
L"E:\\map.bin",
GENERIC_READ|GENERIC_WRITE, // 可读可写
0,
NULL,
CREATE_ALWAYS, // 总是建立新文件
0,
NULL
);
if (INVALID_HANDLE_VALUE == hFile) {
_tprintf(_T("CreateFile() failed. code:%d\n"), GetLastError());
}
else {
hFMap = CreateFileMapping( // 创建文件映射
hFile,
NULL,
PAGE_READWRITE,  // 读写
1, // 4GB
0,  // 0x1 0000 0000 bytes= 2^32 bytes = 4GB
NULL
);
if (INVALID_HANDLE_VALUE != hFMap) {
PBYTE p = (PBYTE)MapViewOfFile( // 映射到进程空间
hFMap,
FILE_MAP_WRITE,
0,
0,
1024 // 1K 大小
);
if (p != NULL) {
memset(p, 0xFF, 1024); // 设置为0xFF
UnmapViewOfFile(p);
}
}
CloseHandle(hFMap);
CloseHandle(hFile);
}
return 0;
}

------解决方案--------------------
直接fopen()后,fread()就是,设置读取偏移用:
_fseeki64()
获取文件长度用
_filelengthi64(m_pFile->_file)
------解决方案--------------------
再次强调,mapping适合随机读写,不适合超大文件,如果你没办法一次性将文件全部映射,用mapping其实很麻烦

mapping的顺序读写效率和普通IO没有本质区别,随机读写的话,mapping可以直接寻址定位,比普通io的设置偏移要简单高效