请教:在记事本中有几百兆的数据,这些数据都是用于测试的,关键是这几百兆的数据在txt文本都是一行来表示,用ReadString()函数读取相当慢.10兆的数据都得用20分钟.任务很简单:这些数据都是有规律的,每60个一组,相邻两个组作比较.我想能否每次只读取60个,比如第一次读出60个存起来,然后记住当前的位置,第二次从上一次的当前位置接着读60个,记住当前位置也就是120,第三次从第二次结束的位置继续读....直到结束.   但我不知道有什么函数来实现,因为这几百兆的数据都是一行.如何记录每次读60个以后的位置.    还有我在网上看到用内存映射来处理.能否给出一个小例子,小女子非常感谢啦!

解决方案 »

  1.   

    找下STL库里面的算法,用个处理60个字符的迭代器,在找个队列什么的容器来处理,可能速度比单纯的用ReadString要好上一些。
      

  2.   

    读完60个数据后,设置begin开始位置
      

  3.   

    你可以看看《windows核心编程(第5版)》的第17章 内存映射文件
    这个应该能够给你一些启发。
      

  4.   

    谢谢楼上的,你说的没错。第一个60和第二个60比,第二个60和第三个60比,这样一直进行下去,直到结束。 我这个就是用来测试的,我也知道不难,但是很着急,方便的话能否给出代,谢谢了。
    [email protected]
      

  5.   

    BOOL FileCompare(PCTSTR pszPathname) /*参数:文件绝对路径*/ 
    {
       // 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章 内存映射文件 上修改的。
    这么做应该可以。
    呵呵。
    不知道有没有误导你。
      

  6.   

    多谢,我再弱弱的问一下,上面程序while中应该这样写吧:
    char a[60], b[60]; 
    while(pvFile!=NULL) 

          memcpy(a,pvFile,60); 
          memcpy(b,pvFile,60);  
          比较a,b,
       SetFilePointer(pvFile,60,0,FILE_BEGIN );
     
          ... 

      

  7.   

    char a[60], b[60]; //这里最好换成TCHAR,因为这样可接收Unicode和非Unicode字符
    while(pvFile!=NULL) 

          memcpy(a,pvFile,60); 
          memcpy(b,pvFile + 60,60);  
          比较a,b, 
           SetFilePointer(pvFile,60,0,FILE_BEGIN ); 
          ... 
      

  8.   

    我在用fread(buffer,1,60,fp)读取的时候,文件指针fp应该自增,因此我在外边用while(fp!=NULL)来判断是否读完,但是却跳不出这个循环了;我只用了很少的数据作试验,这是怎么回事啊?
      

  9.   

    while(pvFile!=NULL) 
      { 
          memcpy(a,pvFile,60); 
          memcpy(b,pvFile+60,60);  //这一行有错!!
         // 比较a,b, 
          SetFilePointer(pvFile,60,0,FILE_BEGIN ); 
          ... 
      } error C2036: 'void *' : unknown size
      

  10.   

    还有,while(pvFile!=NULL) 
         { 
           } 
    这条语句特耽误时间,好像进了一个死循环一样,我尝试了一个1K的文件,看window任务管理器一直在执行。
      

  11.   

    pvFile指针也会自增么?可以自增的话就不用SetFilePointer(pvFile,60,0,FILE_BEGIN )来设置指针的位置了吧。还有SetFilePointer(pvFile,60,0,FILE_BEGIN )的返回值总是-1啊?应该是60才对吧?
      

  12.   

    SetFilePointer(pvFile,60,0,FILE_BEGIN)pvFile不是文件指针,应该是文件的句柄才对。SetFilePointer函数:http://blog.csdn.net/caimouse/archive/2007/10/22/1837984.aspxWINBASEAPI
    DWORD
    WINAPI
    SetFilePointer(
       __in     HANDLE hFile,
        __in     LONG lDistanceToMove,
        __in_opt PLONG lpDistanceToMoveHigh,
        __in     DWORD dwMoveMethod
        );
     
    hFile是文件句柄。
    lDistanceToMove是文件指针距离头或尾的长度。
    lpDistanceToMoveHigh是文件指针距离头或尾的长度高位长度。
    dwMoveMethod是相对文件头、文件尾或者当前位置的方式。
      

  13.   

    回过头来总结一下,PVOID pvFile = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0); 应该改为
    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;