CFileDialog fileDlg(TRUE,_T("*.txt"),_T("*.txt"),NULL,_T("文本文件(*.txt)|*.txt||"),this);
if (fileDlg.DoModal() == IDOK)
{
SYSTEM_INFO sinf;
GetSystemInfo(&sinf);
HANDLE hFile = CreateFile(fileDlg.GetPathName(), GENERIC_WRITE | GENERIC_READ, 0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("文件不能打开!"));
}
HANDLE hFileMaping = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,NULL);
if(hFileMaping == NULL)
{
AfxMessageBox(_T("创建文件内核失败!"));
}
DWORD dwFileSizeHigh;
__int64 qwFileSize = GetFileSize(hFile,&dwFileSizeHigh);
qwFileSize += (((__int64)dwFileSizeHigh)<<32);
CloseHandle( hFile );
__int64 qwFileOffset = 0,qwnumofos=0,numberOfVerts = 0;
while(qwFileSize>0)
{
DWORD dwbytesblock =sinf.dwAllocationGranularity;
if (qwFileSize<sinf.dwAllocationGranularity)
dwbytesblock=(DWORD)qwFileSize;
PBYTE pbfile=(PBYTE)MapViewOfFile(hFileMaping,FILE_MAP_READ,0,0,0);
//PBYTE pbfile=(PBYTE)MapViewOfFile(hFileMaping,FILE_MAP_READ,(DWORD)(qwFileOffset>>32),(DWORD)(qwFileOffset&0xffffffff),dwbytesblock);
PSTR pchAnsi = (PSTR)pbfile;
//记录首地址
PSTR pchAnsi1 = (PSTR)pbfile;
//记录首地址
pchAnsi[qwFileSize / sizeof(char)] = 0;
//文件占有的字节数
pchAnsi1[qwFileSize/ sizeof(char)] = 0;
//文件占有的字节数
PSTR pchAnsi2 = NULL;
//定义与地址一致的变量,用以将某个地址值赋值给它
PSTR pchAnsi3 = NULL;
//定义与地址一致的变量,用以将某个地址值赋值给它
//每次读取一行文本,统计行数
//记录个数的变量
pchAnsi2 = strchr(pchAnsi, '\n' );
//pchAnsi 是内核中文件首地址,从这开始,
//寻找第一次出现\n(换行)的地址,赋给 pchAnsi2
while( pchAnsi2 != NULL )
//判断是否到文件末尾
{
numberOfVerts++;
pchAnsi = pchAnsi2 + 1;
//地址跳过已读过的一行
pchAnsi2 = strchr(pchAnsi, '\n');
//寻找下一个换行符
}
下面如何写
7 个解决方案
#1
不可能!
一行一行的读取?你说一行有多少字节?
貌似没有规定吧。
你换个说法,一次操作多少个字节
内存映射文件可以完成每次映射多少个字节,比如系统粒度的倍数。
至于映射后,是否是你的规律,是个问题.
#2
系统的分配粒度不是随机的吗,我可以不指定吧
#3
应用程序预定地址空间,的地址,必须是分配粒度的整数倍。
预定一块区域,是4k的倍数。
具体我也没搞定,等大神吧。
#4
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366548(v=vs.85).aspx
参考这里,映射的时候,偏移必须是系统粒度的整数倍。
或者完全偏移,直接传0
lpMapAddress = MapViewOfFile(hMapFile, // handle to
// mapping object
FILE_MAP_ALL_ACCESS, // read/write
0, // high-order 32
// bits of file
// offset
dwFileMapStart, // low-order 32
// bits of file
// offset
dwMapViewSize); // number of bytes
// to map
#5
文件映射如果没有非常好的映射规则,其实ReadFile读大量数据处理效率其实差不太多的
#6
用双缓冲吧,一个MapFile 两个View, 遇到一个View的最后数据不是换行,另一个View 要覆盖一整行
两个View交错即可;
|=====View1 ===============| |=====View1 ===============|
=====================================================
| \n | \n \n ........ |数据
======================================================
|========= View2 ===========|
两个View交错即可;
|=====View1 ===============| |=====View1 ===============|
=====================================================
| \n | \n \n ........ |数据
======================================================
|========= View2 ===========|
#7
文件映射,可以破除,第一次打开文件,太慢的噩梦。
#1
不可能!
一行一行的读取?你说一行有多少字节?
貌似没有规定吧。
你换个说法,一次操作多少个字节
内存映射文件可以完成每次映射多少个字节,比如系统粒度的倍数。
至于映射后,是否是你的规律,是个问题.
#2
系统的分配粒度不是随机的吗,我可以不指定吧
#3
应用程序预定地址空间,的地址,必须是分配粒度的整数倍。
预定一块区域,是4k的倍数。
具体我也没搞定,等大神吧。
#4
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366548(v=vs.85).aspx
参考这里,映射的时候,偏移必须是系统粒度的整数倍。
或者完全偏移,直接传0
lpMapAddress = MapViewOfFile(hMapFile, // handle to
// mapping object
FILE_MAP_ALL_ACCESS, // read/write
0, // high-order 32
// bits of file
// offset
dwFileMapStart, // low-order 32
// bits of file
// offset
dwMapViewSize); // number of bytes
// to map
#5
文件映射如果没有非常好的映射规则,其实ReadFile读大量数据处理效率其实差不太多的
#6
用双缓冲吧,一个MapFile 两个View, 遇到一个View的最后数据不是换行,另一个View 要覆盖一整行
两个View交错即可;
|=====View1 ===============| |=====View1 ===============|
=====================================================
| \n | \n \n ........ |数据
======================================================
|========= View2 ===========|
两个View交错即可;
|=====View1 ===============| |=====View1 ===============|
=====================================================
| \n | \n \n ........ |数据
======================================================
|========= View2 ===========|
#7
文件映射,可以破除,第一次打开文件,太慢的噩梦。