文件中,保存着每个顶点的X,Y和Z坐标,中间用空格隔开,每个顶点占一行,部分数据存放如下示:
-1.788707e+002 3.188386e+002 1.374012e+002 //第一点(此为本人注,文件中只有前面数据)
-1.405130e+002 3.088977e+002 1.834182e+002 //第二点
...                                        //...
-2.985877e+001 3.088977e+002 2.291170e+002 //第N点
现在我要将以上文件的数据全部读入并存储至动态数组:m_selPt中,其中此动态数组所属的类有X,Y和Z三个成员变量.我的程序初步规划如下:
         CFileDialog fileDlg(TRUE);
         fileDlg.m_ofn.lpstrTitle="打开测点";
fileDlg.m_ofn.lpstrFilter="Text Files(*.txt)\0*.txt\0
                 All Files(*.*)\0*.*\0\0";
         if(IDOK==fileDlg.DoModal())
{
             FILE* file;
    int i=0;
    if((file = fopen(fileDlg.GetFileName(),"r")) == NULL)
return FALSE;     CSelPt* spt = NULL;
             char str[80];
    while(fscanf(file,"%s",str)==1)
        {
    spt = new CSelPt();
  fscanf(file,"%e %e %e",&(m_SelPtList[i]->x),
        &(m_SelPtList[i]->y),&(m_SelPtList[i]->z));
  AddSelPt.Add(spt);//将此点加入动态数组中
                    i++;
            }
         }
运行时,执行打开操作时前若没有重新选择一个点至m_SelPtList中就会出错,即m_SelPtList为空时会出错误.即使先选择一个点至m_SelPtList中,其最终结果也不对,即打开会读入的数据不是原文件中准备读入的数据.请教:我用fscanf处理原文件中换行的问题可对?程序错误?谢谢回复!

解决方案 »

  1.   

    是不是?   fscanf(file,"%e %e %e",&(m_SelPtList[i]->x),
            &(m_SelPtList[i]->y),&(m_SelPtList[i]->z));改为:
      fscanf(file,"%e %e %e",&(spt->x),
            &(spt->y),&(spt->z));
    不知道你的CSelPt如何实现的;好像还有其它问题呦
    fscanf(file,"%s",str);读到是什么?
    fscanf(file,"%e %e %e",&(spt->x),
            &(spt->y),&(spt->z));想读到什么?
      

  2.   

    哦,谢谢crumpy()先!
    我是想将文件上的数据(一行为一个点,一个点又有X,Y和Z三个坐标)读入到我这个动态数组m_SelPtList中.
    很正确,我将spt错写成m_SelPtList[i]了.
    因为原文件中的数据是一行一行地保存顶点坐标的,我想用fscanf将文件中的数据读入到*spt中.第一个fscanf我是想用来判断换行信息的,不过好像这个不行:<
    有无好介绍呢?谢谢!
      

  3.   

    其实你不用考虑换行符的, 因为fscanf会自动跳过他们的, 就象空格一样, 所以只需要
    fscanf(file,"%e %e %e",&(spt->x),
            &(spt->y),&(spt->z));就可以了, 可以检验它的返回值, 一旦读到的数据个数不是3, 就说明出错了, 或读完成了.
      

  4.   

    这样吗?
             if(fscanf(file,"%e %e %e ",&(spt->x),&(spt->y),&(spt->z))==3)
    {
                 spt = new CSelPt();
           m_SelPtList.Add(spt);//将此点加入到动态数组中去
    }
      

  5.   

    这个判断有问题:<
    但不加此判断又只能读入一个点:<,
    而且读入的点是错误的:<crumpy()兄,再帮帮忙哦:)
      

  6.   

    while( 1 )
    {
    ...
    if(fscanf(file,"%e %e %e ",&(spt->x),&(spt->y),&(spt->z))==3)
    {
                 spt = new CSelPt();
           m_SelPtList.Add(spt);//将此点加入到动态数组中去
    }
    else break;...
    }这样只能读到一个点?
      

  7.   

    不行!这样写的话运行出错了:<,一个点也读不进来.之前那种写法可以读入一个点,但读入的结果却是错误的:<
      

  8.   

    spt->x, spt->y, spt->z中的x, y, z是double型还是float, 如果是double, 把%e该成%le, 我试了, 可以的, 除非程序其它地方有错误.
      

  9.   

    嗯,将%e改为%le后读入的第一个点是正确的,但是...
    if(fscanf(file,"%e %e %e ",&(spt->x),&(spt->y),&(spt->z))==3);//这一句还是运行不了.单步调试时错误如下:
    Unhandled exception in Enhanced STLViewer.exe(MSVCRTD.DLL):0xC0000005:Access Violation.
    运行时弹出一个"遇到问题需要关闭"的错误对话框......:<
      

  10.   

    我用了一个判断是否到达文件底端的函数feof()来判断,如下
            while(!feof(file)) 
    {
          spt = new CSelPt();
         fscanf(file,"%le %le %le",&(spt->x),&(spt->y),&(spt->z));
         m_SelPtList.Add(spt);//将此点加入到动态数组中去
    }
    这样可以将文件中的全部顶点读入,但是有一个问题好奇怪:第一个顶点的X坐标,即第一个数据缺失了第一个字符,比如原文件是"-6.957470e-001"的,读入变成了"6.957470e-001"了.
    还有一个问题是会加多一个错误的点(其值等于之前所述那个错误点)...
      

  11.   

    最终完成情况分享(:
    CFileDialog fileDlg(TRUE);
    fileDlg.m_ofn.lpstrTitle="打开测点文件";
    fileDlg.m_ofn.lpstrFilter="Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0"; if(IDOK==fileDlg.DoModal())
    {
    FILE* file;
    if((file = fopen(fileDlg.GetFileName(),"r")) == NULL)
    {
    AfxMessageBox("打开测点文件失败!");
    return ;
    } CSelPt* spt = NULL;
    while(!feof(file))
    {
    spt = new CSelPt();
    if(fscanf(file,"%le %le %le ",&(spt->x),&(spt->y),&(spt->z)))//加了这个条件
    {m_SelPtList.Add(spt);//将此点加入到动态数组中去}
    else
    {delete spt;return;}
    }
    fclose(file);
    }
    再次对crumpy()表示感谢!^_^