我在VC++中,自己编写了OnfileOpen,用来打开一个存字符串的文件,再把字符串转化为数组,但我一运行“打开”菜单,就出现关闭对话框,单击调试,就出现“Uhandled exception in scxt.exe (MSVCRTD.DLL):0XC00000005:access violation."再单击确定,就出现标题为”find source“的对话框,上面有:“Please enter the path for INPUT.C"下面是文件打开路径选择对话框。我搞不民百为什么?大家半忙!!!

解决方案 »

  1.   

    可能是指针用错了.
    你最好铁代码出来.你应该用CallStack看看错误的地方的位置
      

  2.   

    void CScxtDoc::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);
        if(dlg.DoModal()==IDOK)
    {
            filename=dlg.GetFileName();
            CStdioFile file;
            CString tmp;
           if(file.Open(filename,CFile::modeRead))
       {
              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.   

    if(file.Open(filename,CFile::modeRead))
    {
       do
      {
         if(!file.ReadString(tmp)) break;
         tmp = new CString;//////////added by hwg需要分配内存///////////
         strArray.Add(tmp);
      }while(1);
      file.Close();
    }
      

  4.   

    hanwg() :你好,把“tmp = new CString;”加入后产生错误如下:
    C:\My Documents\My programs\scxt\scxtDoc.cpp(359) : error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'class CString *' (or there is no acceptable conversion)
    我是菜鸟。
      

  5.   

    根据你的说明,好象if(dlg.DoModal()==IDOK)一句也没有运行就出错了,可能是你的菜单ID和程序的关联出了问题,不是语句的问题。
      

  6.   

    swxh(中重) :你好!可能你说的对,我看了你的留言,才发先我的OnFiLEOpen函数没有重载,我重在后代码没变,但运行点击菜单打开程序一点反应也没有,这是为什么?也就是说:CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT ,str,NULL);语句每被执行或是什么其他原因?能不能帮我分析以下,我早了半天还是不懂。
      

  7.   

    你在你的OnFileOpen函数开始的地方加个MESSAEGEBOX什么的,看看这个函数运行 了没、有。
      

  8.   

    用debug(高断点)一步一步调试不就知道了哪里错
      

  9.   

    everandforever(Forever):我家了一个MessageBox(NULL,"HElp", "ERROR", MB_OK);,但没有运行,这是为什么?等你的回答。
      

  10.   

    你的FILE OPEN没有影射到这个函数上来。
      

  11.   

    我把原来的OnFileOpen函数删掉,在从CLASSWISARD里重载(在CScxtDOC类下),在把刚才的代码拷贝进去,结果编译也不通过了,信息如下:
    Linking...
    scxtView.obj : error LNK2001: unresolved external symbol "protected: void __thiscall CScxtView::OnFileOpen(void)" (?OnFileOpen@CScxtView@@IAEXXZ)
    Debug/scxt.exe : fatal error LNK1120: 1 unresolved externals
    我看不懂。我还查了出现OnFileOpen的地方有六处:
    C:\My Documents\My programs\scxt\scxt.cpp(27): ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
    C:\My Documents\My programs\scxt\scxtDoc.cpp(34): ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
    C:\My Documents\My programs\scxt\scxtDoc.cpp(383):void CScxtDoc::OnFileOpen() 
    C:\My Documents\My programs\scxt\scxtDoc.h(68): afx_msg void OnFileOpen();
    C:\My Documents\My programs\scxt\scxtView.cpp(37): ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
    C:\My Documents\My programs\scxt\scxtView.h(76): afx_msg void OnFileOpen();
    6 occurrence(s) have been found.
      

  12.   

    你VIEW里面这个函数的定义还没有删掉
      

  13.   

    everandforever(Forever) :大虾,你真的很牛,我把
    C:\My Documents\My programs\scxt\scxtView.cpp(37): ON_COMMAND(ID_FILE_OPEN, OnFileOpen)和
    C:\My Documents\My programs\scxt\scxtView.h(76): afx_msg void OnFileOpen();
    两处删掉,程序就没错了,可以运行,但我在本问题开始的问题有出现了,但我在CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT ,str,NULL);语句前家的:
    MessageBox(NULL,"HElp", "ERROR", MB_OK);却可以出现,问题可能出现在dlg的创建语句这里,但为什么呢?还请你多帮忙
      

  14.   

    调试是错误出信息:1023DCA8   mov         dword ptr [ecx],edx
      

  15.   

    可是好象没什么问题,你看看这个帖子吧,换个方式打开文件:http://www.csdn.net/expert/topic/723/723371.xml?temp=.6135218
      

  16.   

    你在函数里面设个断点,看看是哪句出错,MESSAGEBOX显示了,但是没有显示OPENFILE对话框?
      

  17.   

    OPENFILE对话框也显示了,但一点击打开旧出错了,是不是
    CStdioFile file;
            CString tmp;
           if(file.Open(filename,CFile::modeRead))
       {
              do
      {
             if(!file.ReadString(tmp)) break;
             strArray.Add(tmp);
      }while(1);
    这几句的问题
      

  18.   

    你还是设断点跟踪吧,我得下了。DEBUG也是经验的累积,:)
      

  19.   

    我用debug跟踪了以下发现以下几句有问题:
    if(!file.ReadString(tmp))  break;  
                     strArray.Add(tmp);  
                               }while(1);  
    可能是指针用错了或可能是字符串转化为数组时出问题了,怎么改,谁帮帮忙?
      

  20.   

    没有你说的问题呀!
    新建一个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]
      

  21.   

    我把我的文件保存铁出来:
    //文件保存
    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();
      }
    }
    }
      

  22.   

    保存的文件如下:
    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)
    (0.000000,0.000000,0.000000)
    (0.000000,0.000000,0.000000)
    (0.000000,0.000000,0.000000)
    (0.000000,0.000000,0.000000)
    .......
      

  23.   

    我根据你的代码写了一个测试工程,发现根本不是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]
      

  24.   

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