小弟是菜鸟,有一批文件要处理,我想看一下文件中的数据.文件制大小为二十多到一百多兆不等,以二进制浮点型保存,我要从文件里地18个字节开始读取,每读4个字节转化为浮点数,保存到txt文件中,以下是我自己写的程序,由于菜鸟,程序写的很烂,请勿见笑: int k;
float temp[512][18];
float *p;
char str[512];
char szFilters[]= "数据文件(*.dat)|*.dat|All Files (*.*)|*.*||"; 
CFileDialog  filedlg (TRUE, "dat", "*.dat", OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this); ;

CString filen;
if(IDOK==filedlg.DoModal())
{
CString strFile = filedlg.GetFileName();
filen=strFile;
CFile file; 
file.Open(filen,CFile::modeRead,NULL);
ULONGLONG length=file.GetLength();
k=(length-17)/18/4/512;
for (int j=0;j<k;j++)  //有问题
{
file.Seek(17+j*512*18*4,CFile::begin);
file.Read(temp,512*18*4);
p=temp[0];
FILE *pFile = fopen("1.txt","w");
for (int m=0;m<512*18;m++)
{
sprintf(str,"%f",*p);
fwrite(str,7,1,pFile);
              fseek(pFile,2,SEEK_END);
p++; }
}

    
}问题是:1://有问题那行,若把k改为一个小的数可以读出数,若为k,则程序卡死,还会出现0x00000034的内存错误.
       2:保存的txt文件最大只能为81kb,肯定不是原数据的问题,程序有问题;
  请各位大侠指点小弟,另,本人感觉这样读数据太慢了,有没有其它的思路,请赐教!

解决方案 »

  1.   

    文件既然是20到100多M不等,那么可以用内存映射文件
    int nCount,filesize;
    nCount = (filesize - 18)/4; //浮点数数量
    pfile = MapViewofFile(..)
    pfile += 18; //开始读浮点数
    for(int i = 0;i< nCount;i++)
    {
    float ftemp = *(float*)pfile //读取浮点数
    ...写入txt文本
    pfile += 4;
    }
    取消内存映射关闭句柄...(也可以使用窜行化)
      

  2.   

    我先试试楼上说的内存映射方法,按理说用CFile应该读几十兆的文件应该没问题吧,网上有人说读2G的都没问题.