当前位置:首页
开发技术指南» 文章正文
    引言:

 ·我要疯了    »显示摘要«
    摘要: <% classid=request.querystring("classid") %> <% set conn = server.createobject("adodb.connection") conn.open "driver={microsoft access driver (*.mdb)}; dbq="......
    摘要: 如题! ......


用内存文件映射后,如何每次读取一行数据到CString对象中(高分相求)

前面进行内存映射的工作省略....  
  下面是创建视图,并进行访问:  
   
  while   (qwFileOffset   <   m_qwFileSize)  
  {  
  //创建视图映射  
  m_lpbMapAddr   =   (LPBYTE)MapViewOfFile(m_hFileMap,  
      FILE_MAP_ALL_ACCESS,  
    (DWORD)(qwFileOffset   >>   32),  
    (DWORD)(qwFileOffset   &   0xFFFFFFFF),  
    m_dwBlockSize  
    );  
   
  if   (!m_lpbMapAddr)  
  {  
  TRACE(_T("映射文件映射失败,错误代码:%drn"),GetLastError());  
  return   ;  
  }  
   
  //   对映射的视图进行访问  
  DWORD   i   =   0;  
  while(i   <   m_dwBlockSize)  
  {  
  CString   DataStr(_T(""));  
   
  while(*(m_lpbMapAddr   +   i)   !=   10   &&   *(m_lpbMapAddr   +   i)   !=   13   &&   *(m_lpbMapAddr   +   i))  
  {  
  DataStr   +=   *(m_lpbMapAddr   +   i);  
  ++i;  
  }  
  ......  
   
  问题就出在:  
  CString   DataStr(_T(""));  
   
  while(*(m_lpbMapAddr   +   i)   !=   10   &&   *(m_lpbMapAddr   +   i)   !=   13   &&   *(m_lpbMapAddr   +   i))  
  {  
  DataStr   +=   *(m_lpbMapAddr   +   i);  
  ++i;  
  }  
  每次读入一个字节,就得构造一个CString对象.非常慢.失去了内存文件映射速度快的优点,反而比一般方法慢很多!真的.我测试过.慢2-3倍!  
  我是想每次读入一行,并存放在一个CString对象中.然后再进行后续工作.哪位能帮帮忙?谢谢了!

NO.1   作者: qin_wei

CString   DataStr(_T(""));  
  放到第一个循环外边不可以吗  
  在里边清一下DataStr=_T("");

NO.2   作者: beyondtkl

同意楼上    
   
  还有   不用   CString   用char   buf[]数组   速度更快.

NO.3   作者: boxban

前面判断回车换行的地方写错了,修改如下:  
  const   char*   _get_line(const   char*   buf,   int*   len)  
  {  
  const   char*   tmp   =   buf;  
   
  while(*tmp   &&   (*tmp   !=   0x0d   ||   *tmp   !=   0x0a))   ++tmp;  
  *len   =   tmp   -   buf;   //  
   
  if   (*tmp   ==   0)   return   NULL;  
   
  //跳过回车换行符  
  //如果你能够保证是Windows风格的回车换行,则可以直接写作   tmp   +=   2;  
  if   (*tmp   ==   0x0d){   //   Windows   style   New-Line   0x0d   0x0a  
  tmp   +=   2;  
  assert(*(tmp-1)   ==   0x0a);  
  }else{   //   Unix   style   New-Line   0x0a  
  ++tmp;  
  }  
   
  return   tmp;  
  }

NO.4   作者: useresu

内存映射文件不是很懂,  
   
  想借楼主此贴请教一个问题:(楼主莫怪^_^)  
  如果是小数据量,  
  直接读到缓冲区,  
  是不是应该比内存映射文件快啊?  
 

NO.5   作者: nicknide

内存映射的好处是在一些应用领域,比如数据库方面,或者海量数据的结构组织方面。  
  而楼主这个地方从映射文件中然后转化,就失去了映射的意义了。  
  如果需要读的话,可以自己写一个函数啊,因为传统的sscanf这个他返回值是匹配成功的数量,而不是字节数。

NO.6   作者: beyondtkl

如果是小数据量,  
  直接读到缓冲区,  
  是不是应该比内存映射文件快啊?  
   
  --------------------  
  内存映射文件   功能很强大  
   
  主要用在   进程间通信   等方面....可以看   <<Windows核心编程>>   里面有说明.  
 

NO.7   作者: oyljerry

内存映射适合大数据量的读取

NO.8   作者: nicknide

用内存映射来读文件,完全是大才小用,而且不一定能够节省时间。  
   
  一般在数据库之类的地方可以使用...  
  自己写数据库哟.

NO.9   作者: mostideal

up

NO.10   作者: zdy_8212

将保存着,改天看,回房了。呵。。


    摘要: 我使用的推模式,数据集里是有多个表,有的之间有联系,有的之间没有,共同推给报表,可是现在老是出现数据出不来的问题,光是显示个空荡荡的表样子,疯掉了啊! 急请报表大侠大侠帮忙啊!感激不尽啊!! ......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE