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

解决方案 »

  1.   

    fopen
    fread
    fseek
    ftell
      

  2.   

    这样速度会很慢,现在既然要读取,就用CFile来实现,每次少读取点,一点一点读取!
    不过,用一楼的方法也行的!
      

  3.   

    fread()会自动移动指针,你不用管,你只管读就够了
      

  4.   

    The fread function reads up to count items of size bytes from the input stream and stores them in buffer. The file pointer associated with stream (if there is one) is increased by the number of bytes actually read
      

  5.   

    1)映射文件开头的映像。  2)对该映像进行访问。  3)取消此映像  4)映射一个从文件中的一个更深的位移开始的新映像。  5)重复步骤2,直到访问完全部的文件数据。
    CFileDialog fileDlg(TRUE, "*.txt", "*.txt", NULL, "文本文件 (*.txt)|*.txt||", this);
    fileDlg.m_ofn.Flags |= OFN_FILEMUSTEXIST;
    fileDlg.m_ofn.lpstrTitle = "通过内存映射文件读取数据";
    if (fileDlg.DoModal() == IDOK)
    {
     // 创建文件对象
     HANDLE hFile = CreateFile(fileDlg.GetPathName(), GENERIC_READ | GENERIC_WRITE,
       0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
     if (hFile == INVALID_HANDLE_VALUE)
     {
      TRACE("创建文件对象失败,错误代码:%drn", GetLastError());
      return;
     }
     // 创建文件映射对象
     HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
     if (hFileMap == NULL)
     {
      TRACE("创建文件映射对象失败,错误代码:%drn", GetLastError());
      return;
     }
     // 得到系统分配粒度
     SYSTEM_INFO SysInfo;
     GetSystemInfo(&SysInfo);
     DWORD dwGran = SysInfo.dwAllocationGranularity;
     // 得到文件尺寸
     DWORD dwFileSizeHigh;
     __int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
     qwFileSize |= (((__int64)dwFileSizeHigh) << 32);
     // 关闭文件对象
     CloseHandle(hFile);
     // 偏移地址 
     __int64 qwFileOffset = 0;
     // 块大小
     DWORD dwBlockBytes = 1000 * dwGran;
     if (qwFileSize < 1000 * dwGran)
      dwBlockBytes = (DWORD)qwFileSize;
      while (qwFileOffset > 0)
      {
       // 映射视图
       LPBYTE lpbMapAddress = (LPBYTE)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS, 
          (DWORD)(qwFileOffset >> 32), (DWORD)(qwFileOffset & 0xFFFFFFFF),
          dwBlockBytes);
       if (lpbMapAddress == NULL)
       {
        TRACE("映射文件映射失败,错误代码:%drn", GetLastError());
        return;
       }
       // 对映射的视图进行访问
       for(DWORD i = 0; i < dwBlockBytes; i++)
        BYTE temp = *(lpbMapAddress + i);
        // 撤消文件映像
        UnmapViewOfFile(lpbMapAddress);
        // 修正参数
        qwFileOffset += dwBlockBytes;
        qwFileSize -= dwBlockBytes;
      }
      // 关闭文件映射对象句柄
      CloseHandle(hFileMap);
      AfxMessageBox("成功完成对文件的访问");
    }
      

  6.   

    hucailai:谢谢,fread(buffer,size,count,fp)。那我要是一次读60字节,一共500M的大小,就应该这样:
    fread(buffer,60,500*1024*1024/60,fp)? 对么?这个buffer只要定义60就可以了吧?
      

  7.   

    对,我是想用两个数组交叉读,为了好做比较。一次读500MB会很慢吧,是不是应该这样:
    for(i=0;i<500*1024*1024/120;i++)
    {
       fread(buffer1,60,1,fp);
       fread(buffer2,60,1,fp);
       buffer1[60]与buffer2[60]作比较;}
    这样就对了吧? 还有这么做的速度如何?500MB的数据大概多长时间?
      

  8.   

    http://www.builder.com.cn/2007/1020/568500.shtml
      

  9.   

    用内存映射文件,然后直接进行内存指针的比较就行了:
    CreateFile
    CreateFileMapping
    MapViewOfFile
    把MapViewOfFile返回的指针作为字符串指针,根据你的要求加上偏移量(比如60的倍数)就可以访问每个单独的数据,后面就直接用strncmp等字符串比较函数处理。