把一个文本文件,每行都是以“\n”,结尾的字湖串读出放到一个字符串类数组里,但有问题,编译没问题,运行时出错,
CStdio file;
CString tmp;
CStringArray atrrArray;
//用debug跟踪以下几句错
if(!file.ReadString(tmp))  break;  
                 strArray.Add(tmp);  
                           }while(1);  
可能是指针用错了或可能是字符串转化为数组时出问题了,怎么改,谁帮帮忙?
改为while(file.ReadString(tmp))
    strArray.Add(tmp);
还是错。。
不明白的可参考: VC++运行时,用自己边的OnfileOpen打开文件错误 一贴,我把他提前了

解决方案 »

  1.   

    没有你说的问题呀!
    新建一个temp工程,选择Win32 console application!// temp.cpp : Defines the entry point for the console application.
    //#include "stdafx.h"
    #include <iostream.h>
    #include <fstream.h>
    #include <afx.h>
    void main (void)
    {
      CStdioFile fileInput;
      fileInput.Open("First.txt",CFile::modeRead);
      CString strTemp;
      CStringArray strArray;
      while(fileInput.ReadString(strTemp))
    strArray.Add(strTemp);
      int size=strArray.GetSize();
      for(int i=0;i<size;i++)
    cout<<strArray.GetAt(i)<<endl;
    }
    ------------------
    在你的工程目录下建立一个文件first.txt
    内容如下:
    VINET:这是测试数据
    TOMSP:这是测试数据
    HANAR:这是测试数据
    VICTE:这是测试数据
    SUPRD::这是测试数据
    HANAR:这是测试数据
    CHOPS:这是测试数据
    RICSU:这是测试数据
    WELLI:这是测试数据
    HILAA:这是测试数据
    ERNSH:这是测试数据
    CENTC:这是测试数据
    OTTIK:这是测试数据
    QUEDE:这是测试数据
    RATTC:这是测试数据
    ERNSH:这是测试数据
    FOLKO:这是测试数据
    BLONP:这是测试数据
    WARTH:这是测试数据
    FRANK:这是测试数据
    GROSR:这是测试数据
    WHITC:这是测试数据
    WARTH:这是测试数据
    SPLIR:这是测试数据
    RATTC:这是测试数据
    QUICK:这是测试数据
    VINET:这是测试数据
    MAGAA:这是测试数据
    TORTU:这是测试数据
    MORGK:这是测试数据
    BERGS:这是测试数据
    LEHMS:这是测试数据
    BERGS:这是测试数据
    ROMEY:这是测试数据
    ROMEY:这是测试数据
    LILAS:这是测试数据
    LEHMS:这是测试数据
    QUICK:这是测试数据
    QUICK:这是测试数据
    QUICK:这是测试数据
    Love:This is the love!
    ---------------------------------
    PS.
    别忘了在project-->setting->General选项卡中选择using mfc in a shared dll
    [email protected]
      

  2.   

    void CScxtDoc::OnFileOpen() 
    {
    // TODO: Add your command handler code here    CString filename;
        CStringArray strArray;
        CString str="dra files (*.dra)|*.dra||";
    MessageBox(NULL,"HElp", "ERROR", MB_OK);    CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT ,str,NULL);
        if(dlg.DoModal()==IDOK)
    {
            filename=dlg.GetFileName();
            CStdioFile file;
            CString tmp;
           if(file.Open(filename,CFile::modeRead))
       {
       while(file.ReadString(tmp))
               strArray.Add(tmp);
    /*           do
      {
         
            if(!file.ReadString(tmp)) break;  
             strArray.Add(tmp);
      }while(1);*/
             file.Close();
       }
       
    }
    if(strcmp(strArray[0],"onresultdata1=2")==0)
    {
    sscanf(strArray[0],"onresultdata1=%d",onresultdata1);
    sscanf(strArray[1],"nsteps=%d",nsteps);
        CString t;
    t.Format("nsteps=%d",nsteps);
    AfxMessageBox(t,MB_OK,0);
    for(int j=2;j<strArray.GetSize();j++)
    {
    sscanf(strArray[j],"(%f,%f,%f)",partdata[j][0],partdata[j][1],partdata[j][2]);
    }
    }
    if(strcmp(strArray[0],"onresultdata1=4")==0)
    {
    sscanf(strArray[0],"onresultdata1=%d",onresultdata1);
    sscanf(strArray[1],"ngroup=%d",ngroup);
    sscanf(strArray[2],"nsteps=%d",nsteps);
    for(int j=3;j<strArray.GetSize();j++)
    {
    sscanf(strArray[j],"(%f,%f,%f)",alldata[j][0],alldata[j][1],alldata[j][2]);
    }
    }
        UpdateAllViews(NULL); 
           
      

  3.   

    我把我的文件保存铁出来:
    //文件保存
    void CScxtDoc::OnFileSave() 
    {
    if(onresultdata1==2)
    {
      CString string;
      CStringArray strArray; //你的文字串组;(传入)
      strArray.Add("onresultdata1=2\n");
      string.Format("nsteps=%d\n",nsteps);
      strArray.Add(string);
      for(int i=0;i<nsteps;i++)
      {
      string.Format("(%f,%f,%f)\n",partdata[i][0],partdata[i][1],partdata[i][2]);
              strArray.Add(string);
      }
      CString str="文体文件(*.dra)|*.dra||";
              CFileDialog FileDlg(FALSE,NULL,NULL,OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,str,NULL);
              if(FileDlg.DoModal()==IDOK)
      {   CString filename;
      filename=FileDlg.GetPathName()+CString(".dra");
      CStdioFile file(filename,CFile::modeCreate | CFile::modeReadWrite | CFile::typeText );
              file.SeekToBegin();
      for(int j=0;j<strArray.GetSize();j++)
      {
      file.WriteString(strArray[j]);
      }
      file.Close();
      }
    }
    }保存的文件如下:
    onresultdata1=2
    nsteps=180
    (0.000000,0.000000,0.000000)
    (0.000000,0.000000,0.000000)
    (0.000000,0.000000,0.000000)
    (0.000000,0.000000,0.000000)
    (0.000000,0.000000,0.000000)
    (0.000000,0.000000,0.000000)
    (0.000000,0.000000,0.000000)
    (0.000000,0.000000,0.000000)
    (0.000000,0.000000,0.000000)
    (0.000000,0.000000,0.000000)
    (0.000000,0.000000,0.000000)
    ...........
      

  4.   

    想不到你还没有解决这个问题.
    CStringArray添加的应该是指针吧?        CString* tmp = new CString;       if(file.Open(filename,CFile::modeRead))
       {
    while(file.ReadString(*tmp))//不知道引用可不可以用这种参数
                                //不行的话,你改一下.
                         {
                            strArray.Add(tmp);
                            tmp = new CString;
                          }         file.Close();
       }
      

  5.   

    我根据你的代码写了一个测试工程,发现根本不是ReadString()的错误!
    出现的错误是由于你对函数sscanf()使用不正确造成的!
    我给出了一种修改方法:
    (注意:为了简化,我将你的数据文件中的坐标中括号给删掉了,这不会影响你的程序的!----你在村数据文件的时候直接去掉格式字符串中的"()"就行了!
    在每一行的末尾我用逗号分割,例如:
    string.Format
    ("%f,%f,%f,\n",
    partdata[i][0],
    partdata[i][1],
    partdata[i][2]);
    strArray.Add(string);

    --------------------
    我一般不使用sscanf()函数,他有太多的限制,用起来很令人恶心!
    // CTestCStdioFileDoc commandsvoid CTestCStdioFileDoc::OnFileOpen() 
    {
    // TODO: Add your command handler code here    CString filename;
        CStringArray strArray;
        CString str="dra files (*.dra)|*.dra||";

        CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT ,str,NULL);
        
    //Show the Open FileDialog Box!
    if(dlg.DoModal()==IDOK)
    {
            filename=dlg.GetFileName();
            CStdioFile file;
            CString tmp;
           if(file.Open(filename,CFile::modeRead))
       {
       while(file.ReadString(tmp))
               strArray.Add(tmp);
       file.Close();
       }
     }
    //Read data from the strArray! That is ,the input file!
    if(strcmp(strArray[0],"onresultdata1=2")==0)
    {
    CString strTemp;
    strTemp=strArray[0];
    int position=strTemp.Find('=')+1; //delete the substring "onresultdata1="from the strTemp!
    strTemp.Delete(0,position);
    //convert to integer type
    onresultdata1 = atoi((LPTSTR)(LPCTSTR)strTemp);

    strTemp=strArray[1];
    position=strTemp.Find('=')+1;
    strTemp.Delete(0,position);
    nsteps= atoi((LPTSTR)(LPCTSTR)strTemp); CString t;
    t.Format("nsteps=%d",nsteps);
    MessageBox(NULL,t,"The result of steps",MB_OK); CString subString[3];
    //must change the code in here
    for(int j=0;j<nsteps;j++)
    {  
      strTemp=strArray[j+2];
      for(int index=0;index<3;index++)
      { 
    position=strTemp.Find(',')+1;
    subString[index]=strTemp.Left(position);
    //convert to double type
    partdata[j][index]=atof((LPTSTR)(LPCTSTR)subString[index]);
    strTemp.Delete(0,position);
      }
    }
    } //我将你下面的代码屏蔽掉了,你可以根据我的上面的代码修改
    /* if(strcmp(strArray[0],"onresultdata1=4")==0)
    {
    sscanf(strArray[0],"onresultdata1=%d",onresultdata1);
    sscanf(strArray[1],"ngroup=%d",ngroup);
    sscanf(strArray[2],"nsteps=%d",nsteps);
    for(int j=3;j<strArray.GetSize();j++)
    {
    sscanf(strArray[j],"(%f,%f,%f)",alldata[j][0],alldata[j][1],alldata[j][2]);
    }
    }
    */
        UpdateAllViews(NULL); 
      
    }void CTestCStdioFileDoc::OnFileSave() 
    {
    // TODO: Add your command handler code here
    if(onresultdata1==2)
    {
      CString string;
      CStringArray strArray; //你的文字串组;(传入)
      strArray.Add("onresultdata1=2\n");
      string.Format("nsteps=%d\n",nsteps);
      strArray.Add(string);
      //每一行的末尾用逗号分割
      for(int i=0;i<nsteps-1;i++)
      {
      string.Format("%f,%f,%f,\n",partdata[i][0],partdata[i][1],partdata[i][2]);
              strArray.Add(string);
      }
      //去掉最后一行的回车符
      string.Format("%f,%f,%f,",partdata[nsteps-1][0],partdata[nsteps-1][1],partdata[nsteps-1][2]);
      strArray.Add(string);   CString str="文体文件(*.dra)|*.dra||";
              CFileDialog FileDlg(FALSE,NULL,NULL,OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,str,NULL);
              if(FileDlg.DoModal()==IDOK)
      {   CString filename;
      filename=FileDlg.GetPathName()+CString(".dra");
      CStdioFile file(filename,CFile::modeCreate | CFile::modeReadWrite | CFile::typeText );
              file.SeekToBegin();
     for(int j=0;j<strArray.GetSize();j++)
      {
    file.WriteString(strArray[j]);
      }
      file.Close();
      }
    }
    }---------------------
    我的测试数据为:file:testdata.dra
    onresultdata1=2
    nsteps=15
    0.000000,0.255555,0.000000,
    0.000000,0.000000,0.545666,
    0.556666,0.000000,0.000000,
    0.000000,0.568999,0.000000,
    0.000000,0.455555,0.000000,
    0.000000,0.000000,0.565844,
    0.445555,0.000000,0.000000,
    0.000000,0.000000,0.255555,
    0.000000,0.456789,0.000000,
    0.123456,0.000000,0.000000,
    0.000000,0.568796,0.000000,
    0.000000,0.000000,0.564444,
    0.000000,0.456778,0.000000,
    0.456123,0.000000,0.000000,
    0.000000,0.456112,0.000000,
    -----------------------------
    保存后的数据和上面的完全一样!
    你的程序是的话了2个小时的时间,就是为了找出你说的bug,想不到被你误导了!希望你以后碰到错误时,多考虑一下,也许是别的地方引起的!
    跳出三届外,不再五行中
    如果还有疑问发信到:
    [email protected]
      

  6.   

    psusong(我心飞扬):问题解决了,不知该如何谢谢你,为我花了那么多时间,网络无限,我也只能在这里谢谢你了。我刚要往上写我对问题的新的发现,就发现你回帖了,那时正好网不太通,所以现在才回。我也为这个问题花了好久,可能我是刚学,很多问题考虑的不全面,所以一直没进展,也害得各位大虾晕忽忽的,不好意思,在此也谢谢其他热心的人们。谢谢了!!!