我在MFC中先建一个单文档应用程序,并新建了一个对话框,在此对话框中添加一些单选控件和编辑控件,还有保存按钮,和计算按钮。我在保存按钮中编辑文件写入函数,目的是存放单选和编辑控件输入的信息,并给文件指定了具体的保存文件夹。在计算按钮中,需要调用.EXE文件,该文件是利用FORTRAN编写的计算程序,可以根据写入文件中的数据进行计算。
    我现在面临的问题是,执行程序时,向单选按钮和编辑控件输入参数,然后按保存按钮,文件显示已经保存到指定文件夹中,然而点计算按钮时没有反应。但是如果再次执行程序,此时不向对话框中输入任何数据,只是点击计算按钮,则会实现计算过程。而且计算时用到的数据来自上一次保存的文件。
    不知道这是怎么回事,请各位高手帮帮忙呀!!!

解决方案 »

  1.   

    说的我好晕啊,呵呵,但是大体明白了。你在写入数据的时候有没有close掉这个文件,如果没有close,并且你的权限设置的有问题的话,你那个用fortran编写的exe打开文件会失败(因为没有权限),所以无法计算。
    当你关闭程序的时候,系统会帮你把文件close掉,下次你再启动程序的时候就可以调用exe来计算了。
      

  2.   

    一个按钮将参数保存到文件中,另一个按钮启动一个EXE,将参数读进来,然后根据参数来运行是吧?
    先看保存了没有,有没有保存的文件,如果有文件,看看内容对不对。如果内容也对,核对数据格式看看是不是FORTRAN需要的。如果格式也对,再检查参数是否都有效。就这些啦!
      

  3.   

    呵呵,表达能力有限,还是大侠概括的简洁呀!
    有保存的文件,内容也对,数据格式也是对的。也用close了,还换用了下flush.
    为什么,.EXE会用上一次保存的数据呢?
      

  4.   


    exe的数据不是从文件里读取的么,从文件里读取的话读到的就是上一次保存的数据呗。
    你第一次点计算的时候,没有计算,是什么反应?
      

  5.   

    void CGongzuo1::OnFileWrite() 

      CFileDialog gongzuo1Dlg(FALSE);
    gongzuo1Dlg.m_ofn.lpstrFilter="Text Files(*.dat)\0*.dat\0All Files(*.*)\0*.*\0\0";
    gongzuo1Dlg.m_ofn.lpstrDefExt="dat";
      if(IDOK==gongzuo1Dlg.DoModal())
         {
    CFile gongzuo1(gongzuo1Dlg.GetFileName(),CFile::modeCreate|CFile::modeWrite);
            gongzuo1.Write(
    "读入气体分子标识,IMOL=1,2,3,4,5分别代表H2O CO2 CO NO NO2\r\n",
    strlen("读入气体分子标识,IMOL=1,2,3,4,5分别代表H2O CO2 CO NO NO2\r\n"));
              
              if(m_occupation==1)
                 gongzuo1.Write("1", strlen("1"));
              if(m_occupation==2)
                 gongzuo1.Write("2", strlen("2"));
              if(m_occupation==3)
                 gongzuo1.Write("3", strlen("3"));
              if(m_occupation==4)
                 gongzuo1.Write("4", strlen("4"));
              if(m_occupation==5)
                 gongzuo1.Write("5", strlen("5"));
              gongzuo1.Write("\r\n",strlen("\r\n"));
     
       gongzuo1.Write("计算温度(300-3000K),TEM\r\n",strlen("计算温度(300-3000K),TEM\r\n"));
        CString str_tem="";
        GetDlgItemText(IDC_EDIT5,str_tem);
        gongzuo1.Write(str_tem,str_tem.GetLength());
        gongzuo1.Write("\r\n",strlen("\r\n")); 
       gongzuo1.Write("总压(单位 Pa),PTOT\r\n",strlen("总压(单位 Pa),PTOT\r\n"));    CString str_ptot="";
        GetDlgItemText(IDC_EDIT4,str_ptot);
        gongzuo1.Write(str_ptot,str_ptot.GetLength());
        gongzuo1.Write("\r\n",strlen("\r\n"));

        gongzuo1.Write("输出文件名\r\n",strlen("输出文件名\r\n"));
        CString str_w="";
        GetDlgItemText(IDC_EDIT7,str_w);
        gongzuo1.Write(str_w,str_w.GetLength());    gongzuo1.Close();}}
      

  6.   

    其实  你的思路过程可以分拆为2步:
    1、 UI获取值写入文件(UI->file)'
    2、从文件获取值读到FORTRAN值运算。(file->FORTRAN->运算);这样就分开2步进行检测了 
    如果是第一步的话 就先将启动第2步的代码屏蔽掉 然后在第一步完成的时候。执行完close();但是程序还没有退出的时候 删除一下文件试试  如果是文件依然被占用 删除文件会失败的。另外要查看下文件里面的内容是否正确。第二步 要确认文件中在读取的时候文件中已经有写入的有效值 如果没有的话 肯定可以归结为第一步的问题。如果有了的话 就要留意第二步有啥问题了
      

  7.   

    在调用FORTRAN程序时,必须要对文件进行读取吗,我是直接在计算按钮中编入如下代码
    void CGongzuo1::OnButton2() 
    {    
     ShellExecute(NULL,"open",
    "infrared",NULL,NULL,SW_RESTORE);   
     }
      

  8.   

    大侠再帮帮我吧,
    “如果是第一步的话 就先将启动第2步的代码屏蔽掉 然后在第一步完成的时候。执行完close();但是程序还没有退出的时候 删除一下文件试试 ”
    按照你说的可以删除文件,接下来该怎样处理呀???!!!
      

  9.   

    你这问题还没解决呢?
    你这样试试
    创建文件之后手动运行fortran程序
    看看能不能正常运算
      

  10.   

    CFile::modeCreate|CFile::modeReadWrite
      

  11.   

    Reif(IDOK==gongzuo1Dlg.DoModal()) 
        { 
    CFile gongzuo1(gongzuo1Dlg.GetFileName(),CFile::modeCreate|CFile::modeWrite); 
    //.....
    //除了写文件外,没见你把文件名保存下来啊
    //你确定FORTRAN 程序打开的是上面获得的文件吗?
        gongzuo1.Close();} }
      

  12.   

    谢谢各位大侠的帮助,问题已解决:方案如下
    void CGongzuo1::OnFileWrite() 
    {
    // TODO: Add your control notification handler code here
       char temp[1024];
       GetCurrentDirectory(1024,temp);
       。
        。
        。
       SetCurrentDirectory(temp);
     
      }