我在操作CString 对象的时候,出现故障;每次程序运行的时候,都会弹出提示对话框,不胜其烦啊。具体情况如下:
CStdioFile filer(file1, CFile::Read); //filer是CStdioFile 对象操作file1,负责读取file1
CStdioFile filew(file2, CFile::Write);//filew是CStdioFile 对象操作file2,负责写入file2
CString str;
//先进行定位
filer.SeekTOBegin();
filew.SeekToEnd();//抽出file1中指定位置的数据写入file2中
for(int line=1; line=10; line++)
{
 fier.ReadString(str);
 CString test=str.Mid(10,6)+'\n';
//MessageBox(test);用于跟踪显示写入file2的数据
 filew.WriteString(test);
}当程序运行到line=3的时候跳出,且有提示对话框。当使用MessageBox(test);来跟踪的时候,显示为空(当然line==1或2的时候有内容:string)。我的问题是怎样处理这个异常(即:当line==3的时候,用程序处理这个异常,消除对话框的弹出,然后当line>3的时候,程序继续运行,不需要人为干涉)?我看了一下MFC的CString::Mid() 操作,有什么:throw( CMemoryException );兄弟我没有干过这个活,不知道怎样处理,在此有请各位兄弟携手相助。注:不要告诉我在for循环中加入if(line==3)continue;我所处理的对象是不允许这么做的。下面是file1的内容:
0123456789string  //file1的第一行,line1
0123456789string  //file1的第二行,line2
                  //file1的第三行,line2
0123456789string  //file1的第四行,line2
0123456789string
0123456789string
0123456789string
012
0123456789string
0123456789string

解决方案 »

  1.   

    try{
    CString   test=str.Mid(10,6)+'\n'; }catch(...){}catch(...)是捕获所有异常
      

  2.   

    try 不是根本,在 CString   test=str.Mid(10,6)+'\n';  加入 if str.Length() > ... 判断。
      

  3.   

    不,楼上,严格说是str.trimleft().getlength()
      

  4.   

    楼上的两位大哥:
        到底是怎么个处理方法,写出来啊,兄弟对这个不懂啊!!!在catch{  }中到底是什么代码啊,写出来!!!
      

  5.   

    catch(...)就是三个点,捕获所有异常
      

  6.   


    CString file1 = "joe1.txt" ;
    CString file2 = "joe2.txt" ;
    CStdioFile   filer(file1, CFile::modeRead);   //filer是CStdioFile   对象操作file1,负责读取file1 
    CStdioFile   filew(file2,   CFile::modeWrite|CFile::modeCreate);//filew是CStdioFile   对象操作file2,负责写入file2 
    CString   str; 
    //先进行定位 
    filer.SeekToBegin(); 
    filew.SeekToEnd();  //抽出file1中指定位置的数据写入file2中 
    for(int   line=1;   line<=10;   line++) 

    filer.ReadString(str); 
    //AfxMessageBox(str) ;
    CString   test=str.Mid(10,6)+'\n'; 
    //MessageBox(test);用于跟踪显示写入file2的数据 
    filew.WriteString(test); 
    }楼主,你用这个程序试一下。
    在CString::Mid函数的使用中,是不会因为空字符串而出现断言错误的。

    1、你的CStdioFile的构造函数的第二个参数使用的不正确。
    2、for循环中的第一个ReadString的变量名,你写的不对
    3、SeekToBegin的函数名你也写错了。
    这三个地方你修改一下,再调试一下你的程序。
    你可以新建一个Dialog程序,加入一个按钮,再把上面我给你的代码粘进去。然后编译一下。再在*.sln所在的目录中生成一个joe1.txt文件。
    文件的内容为如下所示:
    0123456789string
    0123456789string
     
    0123456789string
    0123456789string
    0123456789string
    0123456789string
    012
    0123456789string
    0123456789string
      

  7.   

    CString file1 = "joe1.txt" ;
    CString file2 = "joe2.txt" ;
    CStdioFile   filer(file1, CFile::modeRead);   //filer是CStdioFile   对象操作file1,负责读取file1 
    CStdioFile   filew(file2,   CFile::modeWrite|CFile::modeCreate);//filew是CStdioFile   对象操作file2,负责写入file2 
    CString   str; 
    //先进行定位 
    filer.SeekToBegin(); 
    filew.SeekToEnd();  //抽出file1中指定位置的数据写入file2中 
    for(int   line=1;   line<=10;   line++) 

    filer.ReadString(str); 
    //AfxMessageBox(str) ;
    CString   test=str.Mid(10,6)+'\n'; 
    //MessageBox(test);用于跟踪显示写入file2的数据 
    filew.WriteString(test); 
    }
    程序代码,好像没有粘上,我再粘一下试试
      

  8.   

    异常操作不可取。
    LZ应该是在行为空的时候或者行不够长的时候将空串写到指定的文件,这样才符合
    抽出file1中指定位置的数据写入file2中
    异常操作无法完成。filer(file1,   CFile::Read); 
    应该是CFile::modeRead吧  for(int line=1; line <= 10; line++)

    filer.ReadString(str); 
    if(str.GetLength() <= 10)
    {
    filew.WriteString("\n"); 
    }
    else
    {
    filew.WriteString(str.Mid(10,6)+"\n"); 
    }
    }

    filer.Close();
    filew.Close();
      

  9.   

    首先:上面的写法有点问题,是笔误,大家不要就这个问题纠缠,我主要是想怎样处理这个抛出的异常
    CStdioFile filer(file1,CFile::modeRead); 
    CStdioFile filew(file2,CFile::modeWrite);
    CString   str; //先进行定位 
    filer.SeekToBegin(); 
    filew.SeekToEnd(); //抽出file1中指定位置的数据写入file2中 
    for(int   line=1;   line=10;   line++) 

      fier.ReadString(str); 
      CString   test=str.Mid(10,6)+'\n'; 
    //MessageBox(test);用于跟踪显示写入file2的数据 
      filew.WriteString(test); 
    } 当程序运行到line=3的时候跳出,且有提示对话框。当使用MessageBox(test);来跟踪的时候,显示为空(当然line==1或2的时候有内容:string)。 我的问题是怎样处理这个异常(即:当line==3的时候,用程序处理这个异常,消除对话框的弹出然后当line> 3的时候,程序继续运行,不需要人为干涉)?我看了一下MFC的CString::Mid()   操作,有什么:throw(   CMemoryException   );兄弟我没有干过这个活,不知道怎样处理,在此有请各位兄弟携手相助。注:不要告诉我在for循环中加入if(line==3)continue;我所处理的对象是不允许这么做的。 
    下面是file1的内容: 
    0123456789string     //file1的第一行,line1 
    0123456789string     //file1的第二行,line2 
                         //file1的第三行,line3 
    0123456789string     //file1的第四行,line4 
    0123456789string 
    0123456789string 
    0123456789string 
    012                  //file1的第八行,line8
    0123456789string 
    0123456789string 
      

  10.   

    CString::Mid本身可以处理空字符。也就是说上面的程序即然是读到第三行是空行,也同样可以正常向下执行,而不会出现断言。
    第一,如果可以,你最好是提供你所使用的源代码
    第二,你所谓的有“提示框”,应该不是断言,因为Mid函数不会因为是空行,而产生断言,上面给你发的程序如果你调试一下,就会验证这个结论。
      

  11.   

    用wang_junjie和shakaqrj的方法,用CString之前先判断CString是否可用
      

  12.   

    我实在是说不过大家,但是我把我的源码抄出来,是用来处理本公司数据的【注:处理正常的文件的时候,是可以正常运行的,能够得出目标,但是对于怪异的文件则会出现问题】void CFilerwDlg::OnOK() 
    {
      CFileFind finder;                     //define CFileFind object
      char* pFileNamew="writeto.txt";       //define 写入数据的文件名
      CString str;                          //define 行字符串                     char* dir="F:\\data\\";               //路径define dir,所处理文件都放在这里
      BOOL bWorking = finder.FindFile("F:\\data\\*.*");
      while(bWorking)
      {
        bWorking= finder.FindNextFile( );
    //  MessageBox(finder.GetFileName());// filename test
        CString fPath=dir+_T(finder.GetFileName()); //absolute path
         TRY
    {     
              CStdioFile filer(fPath,CFile::modeReadWrite);                  
                    CStdioFile filew(pFileNamew,CFile::modeWrite);
    filer.SeekToBegin();
    filew.SeekToEnd();
    /////////////////////////////////////////////////////////////////////
    CString caption;                                                   //
    caption=finder.GetFileName();                                      //
    SetWindowText(caption);                   //display name on caption//
    /////////////////////////////////////////////////////////////////////
    for(int line=1; line<=3; line++)
    {
    filer.ReadString(str);
    if(line==1||line==2)
    continue;
    if(line==3)
    {//将flag作为判断依据,以便决定转入哪一支路
    CString flag=str.Mid(10, 4);
    ///////////////////////////////////////////////////////////////////////////////////////
             if(flag==_T("DS05"))//支路之一
    {  //从新对文件定位,只取其中某些行
    filer.SeekToBegin();
                    for(int i=1; i<=20; i++)
    {
             if(i==1||i==2||i==3||i==4||i==5||i==6)
             if(i==8||i==9||i==10||i==11||i==12   )
            if(i==14||i==15)                 
            if(i==18||i==19||i==20)
    continue; 
    filer.ReadString(str);
    //////////////////////////////////////////////////////////////////////////////////////
                    if(i==7)                            //
           {                                    //
            if(str.Mid(6, 4)==_T("GOOD"))       //
            break;  //jump out loop             //
            else                                //
                                                   {                                    //
            CString errorcode=str.Mid(27,4);    //
    filew.WriteString(filer.GetFileName().Left(8));//
            filew.WriteString(errorcode);       //
            filew.WriteString(_T("DS05.."));    //         }                                   //
                           }                                    //
    //////////////////////////////////////////////////////////////////////////////////////
           if(i==13)
    {
    CString ver=str.Mid(15, 7);
    if(ver.GetLength()<=2)//GPAS03VF
            filew.WriteString(_T("#######"));
    else
    {
    if(ver.GetLength()<=6)
                                    {
    filew.WriteString(ver.Left(5)+_T(".."));
    }
    else
    filew.WriteString(ver);
    }
    }
            if(i==16)
    {
    CString day=str.Mid(18,6);
            filew.WriteString(day);
    }
    if(i==17)
    {
             CString port=str.Mid(13,6)+'\n';
     filew.WriteString(port);
    }//i==17结束
    }//for结束
    }//第一支路结束 else//第二支路
    {
    filer.SeekToBegin();
    for(int i=1; i<=20; i++)
    {
    if(i==1||i==2||i==3||i==4||i==5||i==6)//i=7
    if(i==8||i==9||i==10||i==11||i==12   )//i=13
    if(i==14||i==15||i==16)            //i=17/18
    if(i==19||i==20)
    continue;
    filer.ReadString(str);
    if(i==7)
          {
    if(str.Mid(6, 4)==_T("GOOD"))
    break;//jump out of loop
    else
    {
    CString errorcode=str.Mid(27,4);
    filew.WriteString(filer.GetFileName().Left(8));
    filew.WriteString(errorcode);
    filew.WriteString(_T("DS2000"));
    }
          }
    if(i==13)
    {
    CString ver=str.Mid(10, 7);
            filew.WriteString(ver);
    } if(i==17)
    {
                             CString day=str.Mid(18,6);
            filew.WriteString(day);
    } if(i==18)
    {
     CString port=str.Mid(13,6)+'\n';
             filew.WriteString(port);
    } }//for结束 }//第二支路结束
    }
    }
        filer.Close();
        filew.Close();
    }//end-TRY     CATCH(CFileException,e)
    {
                #ifdef _DEBUG
         afxDump<<"file could not be opened"<<e->m_cause<<"\n";
                #endif
    }
         END_CATCH  }//while结束 CDialog::OnOK();
        MessageBox("恭喜你 !你已成功地加入你的信息。");}
      

  13.   


    F:\\data\\下的一个文件&&BOM    //第一行//文件名称为GPAS00A0
    &,S,T,TL,FC
    TEST LOG [DS2000]
     SN[0GPAS00A0] MODEL[MK3252GSX] TUA[0] LUA[0]
     ** ERROR LOG **
     L0U[0] L0R[0] L1U[0] L1R[0] L2[0] DEFECT[0]
      *** GOOD ***
     ** X-FER DATA **
     W_PASS[0] R_PASS[0] W_BLOCK[0] R_BLOCK[0] TEST VER[EC22D11]
    &,S,T,PROG_VER,EC22D
    &,S,T,DSTYPE,DS2000
    &,S,T,CMPL1,MVL_SATA
    &,S,T,TID,GPAS00A00712021200
    &,S,T,TESTER,FC7715
    &,S,T,MODEL,MK3252GSX
    &,X,D,FIRST_PON,2//另一个文件
    &&BOM    //第一行//文件名称为GPAS00A0
    &,S,T,TL,FC
    TEST LOG [DS05]
     SN[0GPAS00A0] MODEL[MK3252GSX] TUA[0] LUA[0]
     ** ERROR LOG **
     L0U[0] L0R[0] L1U[0] L1R[0] L2[0] DEFECT[0]
      *** TEST FAILURE [CODE = 0B01] ***
     ** X-FER DATA **
     W_PASS[0] R_PASS[0] W_BLOCK[0] R_BLOCK[0] TEST VER[EC22D11]
    &,S,T,PROG_VER,EC22D
    &,S,T,DSTYPE,DS2000
    &,S,T,CMPL1,MVL_SATA
    &,S,T,TID,GPAS00A00712021200
    &,S,T,TESTER,FC7715
    &,S,T,MODEL,MK3252GSX
    &,X,D,FIRST_PON,2
    //异常文件
    &&BOM
    &,S,T,TL,F2
    TEST LOG [DS05]
     SN[0GPAS03H0] MODEL[MK3252GSX] TUA[0] LUA[0]
     ** ERROR LOG **
     L0U[0] L0R[0] L1U[0] L1R[0] L2[0] DEFECT[0]
      *** TEST FAILURE [CODE = T19F] ***
     ** X-FER DATA **
     W_PASS[0] R_PASS[0] W_BLOCK[0] R_BLOCK[0]
     
     
     
    PALET_ID:1  PORT:48
    SEND:IHSSR         : EF
    Mecha No.   : GPAS03H0
    Result      : BUSY
    Start_Time  : 2007/11/27 22:02
    Pal-Port    : F21448
    HR Version  : JC25DN5
    DEFECT      : 0000
    SSR         : 4C
    Reserved    : 56303130533530000000000000000000000000
    Check Sum   : 95PALET_ID:1  PORT:48
    SEND:WHWH
    00..............................
    &,S,T,PROG_VER,JC25DN5......X...
    &,S,T,DSTYPE,SHR.25DN5......X...
    &,S,T,CMPL1,MVL_SATA.5......X...
    &,S,T,TID,GPAS03H00711272202....
    &,S,T,TESTER,F21448.0...........
    &,S,T,MODEL,MK3252GSX...........
    &,X,D,FIRST_PON,2...0...........
    &,X,D2,MEASURE_READ,1,256.......
    &,X,D2,REPEAT_WRITE,0,256.......
    &,X,D,FORMAT_ALL,0..0...........
    &,X,D,SURFACE_SEEK,0............
    &,X,D,FW1BIN_PHEAD,0............
    &,X,D,FW1BIN_FORMAT,0...........
    &,X,D2,GETPARA_REV,0,65531......
    &,X,D,VARIABLE_TPI,1............
    &,S,T,UP_WC,f.......0...........
    &,S,T,UP_RC,10......0...........
    &,S,T,UP_INITWC,19..0...........
    &,S,D,RAPIT_VER,26..0...........
    &,S,D,PCBID,01......0...........
    &,S,T,OPT,H/ET4200..............
    &,S,T,EXTOPT,/HT0/ME0/MT0.......
    &,S,T,UP_WC,f.......0...........
    &,S,T,UP_RC,10......0...........
    &,S,T,UP_INITWC,19..0...........
    &,S,T,UP_WC,f.C,....0...........
    &,S,T,UP_RC,10.,....0...........
    &,S,T,UP_INITWC,19..0...........
    &,S,D,FW_VER,LV010S50...........
    &,C,D3,UMODE_CHS,620181,16,63...
    &,C,D3,MMODE_CHZ,123152,4,36....
    &,S,T,DFMT,36-3420-32-12........
    &,S,T,SYSDATA,123140-123121-10!.
    !0-116-2-20-1-4-21.0-123121-10!.
    &,S,T,MECHADATA,156-27-111......
    &,S,T,HDPARA,12-20-2............
    &,X,S,STP1,0.... ...0...........
    &,X,S,STP2,0.... ...0...........
    &,X,S,STP3,0.... ...0...........
    &,S,T,HEADTYPE,0....0...........
    &,X,D,PONTIME,2.....0...........
    &,S,D,MODEL,MK3252GSX ..........
    &,X,D,ROTATE,0......0...........
    &,X,D,ROTATE_TM,480.0...........
    &,X,S,STP4,532.. ...0...........
    &,X,H,CO_MAX,128119,128266,128!.
    !233,127954.........128266,1....
    &,X,H,CO_MEAN,128097,128244,12!.
    !8192,127913........,128244,....
    &,X,H,CO_MIN,128076,128223,128!.
    !152,127873.........128223,1....
    &,X,H,CYL-OFFSET,-116,-182,-19!.
    !6,192.YL-OFFSET,-116,-182,-19!.
    &,X,D,CylOffset_TM,79...........
    &,X,D,HensinComp_TM,11..........
    &,X,H,1HEN_SIN,-5,-15,82,74.....
    &,X,H,1HEN_COS,91,87,-165,-169..
    &,X,H,2HEN_SIN,7,0,7,-2.5,-1....
    &,X,H,2HEN_COS,-4,1,-11,7.-1....
    &,X,H,3HEN_SIN,-2,0,1,6.7.-1....
    &,X,H,3HEN_COS,3,0,0,0..7.-1....
    &,X,H,4HEN_SIN,0,0,0,0..7.-1....
    &,X,H,4HEN_COS,0,0,0,0..7.-1....