在VC中,我想保存一些变量到文档中,一个个写入太麻烦,可不可以把这些变量设置成类或者结构体一起保存,下次读取时在赋给这个结构体成员,最好有代码,解决马上结贴!高结贴率!

解决方案 »

  1.   

    当然可以。读写的时候直接将结构指针送进去就行了。CFile file(...);
    SomeStruct s;
    // 写的时候
    file.Write(&s, sizeof(s));
    //读的时候
    file.Read(&s, sizeof(s));
      

  2.   

    看我的
    这是我的一个打印程序中的部分代码 struct Rule 
    {
    CPoint point;
    char text[100];
    }rule;

    int i=0;
    if(!file.Open(pszFileName,CFile::typeBinary|CFile::modeRead),&fileException)
    {

    //文件操作代码
    file.SeekToBegin();
    // DWORD pos = file.GetPosition();
    while (file.Read((char*)&rule,sizeof(rule)))
    {
    dc.StartPage();
    dc.TextOut(200,60+i*80,str[++i]);
    dc.TextOut(rule.point.x,rule.point.y,rule.text);
    dc.EndPage();
    }

    file.Close();
    }  
      

  3.   

    还有写的
    char* pszFileName ="record.txt";
    CStdioFile file;
    CFileException fileException;
    if(!file.Open(pszFileName,CFile::typeBinary|CFile.modeCreate|CFile::modeWrite),&fileException)
    {
    //文件操作代码
    for (int i =1;i<7;i++)
    {
    rule.point.x = 20*i;
    rule.point.y = 20*i;
    sprintf(rule.text,"%d",i);
    //rule.text.Format("%d",i);
    file.Write((char*)&rule,sizeof(rule));
    }
    file.Close();
    }
      

  4.   

    void CMytestDlg::OnBnClickedOk()
    {
        MyTest mytest;
        mytest.iMyOld = 10;
        mytest.strMyName = "dshdkahdks";
        CString strDefFileName = COleDateTime::GetCurrentTime().Format(_T("%Y%m%d%H%M%S"));
        CFileDialog dlg(FALSE, _T("txt"), strDefFileName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("txt Files(*.txt)|*.txt|All Files(*.*)|*.*||"));
        if (IDOK == dlg.DoModal())
        {
            CString strFileName = dlg.GetPathName();
            //char* pszFileName ="record.txt";
            CFile file;
            CFileException fileException;
            if(!file.Open(strFileName,CFile::typeBinary|CFile.modeCreate|CFile::modeWrite),&fileException)
            {
                //文件操作代码
                file.Write(&mytest,sizeof(mytest));
                file.Close();
            }
        }
    }为什么我没有写进去呢?
      

  5.   


    然后你单步执行下看看文件是否打开成功了。打开成功了的话
    file.Write((void*)&mytest,sizeof(mytest));这样看看有效果么?
      

  6.   

      if(!file.Open(strFileName,CFile::typeBinary|CFile.modeCreate|CFile::modeWrite),&fileException)
      {
      //文件操作代码
      file.Write(&mytest,sizeof(mytest));
      file.Close();
      }
    再仔细看看你的代码
      

  7.   

    那你这样就肯定不能写进去了啊,
     if(!file.Open(strFileName,CFile::typeBinary|CFile.modeCreate|CFile::modeWrite),&fileException)
      {
      //文件操作代码
      file.Write(&mytest,sizeof(mytest));
      file.Close();
      }
    }
    判断它是否打开成功,成功了才写,不成功当然就写不进去了啊。
      

  8.   

    那如何写进去呢?我刚接触VC,以前都用C#,谢谢了
      

  9.   

    void CMytestDlg::OnBnClickedOk()
    {
        CString strFileName;
        MyTest mytest;
        mytest.iMyOld = 10;
        mytest.strMyName = "liqiu";
        CString strDefFileName = COleDateTime::GetCurrentTime().Format(_T("%Y%m%d%H%M%S"));
        CFileDialog dlg(FALSE, _T("txt"), strDefFileName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("txt Files(*.txt)|*.txt|All Files(*.*)|*.*||"));
        if (IDOK == dlg.DoModal())
        {
            strFileName = dlg.GetPathName();
        }    CFile file;
        if(!file.Open(strFileName, CFile::modeRead))
        {
            return;
        }
        else
        {
            file.Write((MyTest*)&mytest,sizeof(mytest));
        }
        file.Close();}如果新建一个txt直接return了
    在原有上保存,运行时又出错。
      

  10.   

    if(!file.Open(strFileName,CFile::typeBinary|CFile.modeCreate|CFile::modeWrite),&fileException)
      {
      //文件操作代码
      file.Write(&mytest,sizeof(mytest));
      file.Close();
      }
      else
      {
         SECURITY_ATTRIBUTES attribute;
         attribute.nLength = sizeof(attribute);
         attribute.lpSecurityDescriptor = NULL;
         attribute.bInheritHandle = FALSE;
         if(CreateDirectoryA(strFileName,&attribute) == 0)
         {
    AfxMessageBox("false");
         }
         else
         {
            if(!file.Open    (strFileName,CFile::typeBinary|CFile.modeCreate|CFile::modeWrite),&fileException)
            {
             //文件操作代码
               file.Write(&mytest,sizeof(mytest));
              file.Close();
            }//endif      }//endif
      }//endif
      

  11.   

    if(!file.Open(strFileName, CFile::modeRead))//这里是打开成功
      {
      return;//打开成功这里就不能return了,你应该弹出一个“请选择你要保存的路径”选择完了创建这个路径文件然后再打开文件写内容;
      }
      else
      {
      file.Write((MyTest*)&mytest,sizeof(mytest));//这里应该也是创建文件,实现写内容保存功能
      }
      file.Close();
      

  12.   

    syhkgyxy2010
    您能帮我写一个例子么,就简单把一个结构体的内容写入文本就行,我会另外开一个给你分的。
      

  13.   

    我实在不知道你们都在干什么
    能不能仔细看看自己写的代码,if(!file.Open...到底是成功了还是没成功??!!
      

  14.   

    百分求解决方案
    struct MyTest
    {
        CString strMyName;
        int     iMyOld;
    };
    只要能把上面的结构体实现保存,另存(有另存为对话框),打开(以保存的结构体)的文档的程序代码,另开贴百分相送,高结贴率决不食言!
      

  15.   

    if(!file.Open(strFileName,CFile::typeBinary|CFile.modeCreate|CFile::modeWrite),&fileException)
      {
      //文件操作代码
      file.Write(&mytest,sizeof(mytest));
      file.Close();
      }
    这段代码实在很强大
      

  16.   

    你的这个结构体是不能这么直接写的。CString本质是一个指针,你把一个指针写到文件里去做什么?你下次从文件里读出这个指针的时候,它指向的内存块还存在吗?
      

  17.   


    哦,刚接触VC,以前都用的C#
    我就想实现一个字符串,用char也行,只要能实现上述三功能,绝对开贴给分,麻烦大家了,很急!谢谢!
      

  18.   

    单就写入而言(且不论写入的东西有没有意义),你在10楼的代码是没有问题的(当然,你必须把file.Open前面的那个感叹号去掉)。
      

  19.   

    如果你的结构体内不是CString或者TCHAR *之类的东西,而是固定长度的字符数组(例如TCHAR szMyName[16]),那么你10楼的代码就足够了,还问别人要干什么?
      

  20.   

    我改成这个类型了TCHAR szMyName[16]但10楼的代码,保存的文档是乱码。
      

  21.   

    改成
    void CMytestDlg::OnBnClickedOk()
    {
        MyTest mytest;
        mytest.iMyOld = 10;
        memcpy(&mytest.strMyName, _T("fdsfsf"), sizeof(_T("fdsfsf")));    CString strDefFileName = COleDateTime::GetCurrentTime().Format(_T("%Y%m%d%H%M%S"));
        CFileDialog dlg(FALSE, _T("txt"), strDefFileName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("txt Files(*.txt)|*.txt|All Files(*.*)|*.*||"));
        if (IDOK == dlg.DoModal())
        {
            CString strFileName = dlg.GetPathName();
            //char* pszFileName ="record.txt";
            CFile file;
            CFileException fileException;
            if(file.Open(strFileName,CFile::typeBinary|CFile.modeCreate|CFile::modeWrite),&fileException)
            {
                //文件操作代码
                file.Write(&mytest,sizeof(mytest));
                file.Close();
            }
        }
    }文档中输出的是:
    f d s f s f   烫烫烫烫烫烫烫烫烫烫烫烫烫
       
      

  22.   

    结构体定义是
    struct MyTest
    {
        TCHAR strMyName[20];
        int     iMyOld;
    };
      

  23.   

    这就好办了啊,你将他们分别命名,然后存到.ini文件中,然后用的时候再到.ini文件中读取不就OK了么。
      

  24.   


    struct MyTest
    {
    CString txt;
    int intval;
    };void Save()
    {
    CFile file("sjorh.txt", CFile::modeCreate|CFile::modeWrite);
    CArchive saveArchive(&file, CArchive::store); MyTest test1;
    test1.txt = "sgesjshs";
    test1.intval = 2; saveArchive<<test1.txt<<test1.intval; saveArchive.Close();
    file.Close();
    }void Read()
    {
    CFile file("sjorh.txt", CFile::modeRead);
    CArchive saveArchive(&file, CArchive::load); MyTest test1; saveArchive>>test1.txt>>test1.intval; saveArchive.Close();
    file.Close();
    }
      

  25.   

    CString b = "abn";
    CString strDefFileName = COleDateTime::GetCurrentTime().Format(_T("%Y%m%d%H%M%S"));
    CFileDialog dlg(FALSE, _T("txt"), strDefFileName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("txt Files(*.txt)|*.txt|All Files(*.*)|*.*||"));
    if (IDOK == dlg.DoModal())
    {
    CString strFileName = dlg.GetPathName();
     //char* pszFileName ="record.txt";
    CFile file;
    CFileException fileException;
    if(!file.Open(strFileName,CFile::typeBinary|CFile.modeCreate|CFile::modeWrite),&fileException)
    {
      //文件操作代码
    file.Write(b,b.GetLength());
    file.Close();
    } }
    我这样写进去就没有乱码。
      

  26.   

    你字符串后面没有加截止符0,当然就变成那样了。memcpy(&mytest.strMyName, _T("fdsfsf"), sizeof(_T("fdsfsf")))
    改成
    _tcscpy(mytest.strMyName, _T("fdsfsf"));当然,即使这样写出的文件,你可以用相同的方法从文件里读出来,但如果直接用记事本之类的东西打开看的话,因为既然TCHAR strMyName[20],那么你写到文件里的一定是20个TCHAR,字符串截止符后面的东西当然就是乱码。
      

  27.   


    可能有字符串,整型数或double型的
      

  28.   

    我也想不出来用什么来存储了,要是像你说的定义结构体的话,要我说是行不通,它写进去就是乱码,
    CFile cf;
    int  =10;
    cf.Write(&a,sizeof(int));//int 型。
    这样写进去。