我需要存储文件的配置信息到硬盘中,不用数据库,工程是基于dialog的,存储的是自定义的一个数据结构数组,
数据结构LINKINFO中存有CSTRING二重数组和INT二重数组,有没有比较简单的方法存储,目前LINKINFO类继承CObject
但CSTRING数组和INT数组不能直接CArchive,怎么解决。另外LINKINFO数组该如何保存至硬盘中,又该怎样读出。
是否有更简单的方法 不需要用MFC的serilize机制.

解决方案 »

  1.   

    给CSTRING数组和INT数组也加上serilize功能,
      

  2.   

    CString可以用<<和>>储存和加载。
    如果不用串行化,可以自己把字符串长度和内容储存到文件,例如用4字节表示长度,后面跟着字符串内容。
      

  3.   

    就是基于dialog的文件存储用serilize好像跟doc-view的还不一样,那个只需要数据改变了自己会提示存储。
      

  4.   

    关于结构化存储的示例代码   
      /*   
      序列化就是对数据进行结构化存储,其存取过程都需要类CArchiver的对象   
      但对于数据,并不要求是不是由CObject派生,甚至是不是类都没关系   
      */   
      class   CA   
      {   
      public:   
      char   name[9];   
      BOOL   sex;   
      int   age;   
      CString   address;   
      public:   
      CA(){}   
      ~CA(){}   
      public:   
      void   Serialize(CArchive&ar);   
      };   
      void   CA::Serialize(CArchive&ar)   
      {   
      CString   text;   
      //   是不是类无关紧要,函数名是不是Serialize也无关紧要,紧要的只是要有CArchive对象   
      if(ar.IsStoring())//这个判断是自动进行的,因为创建CArchive对象时指定了是store还是load   
      {   
      text=name;/ ar*不能用(定义成CString就好了)   
      ar<<text<<sex<<age<<address;   
      }   
      else   
      {   
      ar>>text>>sex>>age>>address;   
      strcpy(name,text.GetBuffer(0));   
      }   
      }   
        
      class   CB   
      {   
      public:   
      int   index;   
      CA   ca;   
      public:   
      CB(){}   
      ~CB(){}   
      //没有定义Serialize(),但完全可以象CA那样定义   
      };   
        
      void   CAdoBlobDlg::OnButtonStore()     
      {   
      CB   cb;   
      cb.index=1;   
      strcpy(cb.ca.name,"王进");   
      cb.ca.sex=TRUE;   
      cb.ca.age=30;   
      cb.ca.address="济南";   
      CFile   file;   
      if(file.Open("c:\\abc.dat",CFile::modeWrite|CFile::modeCreate))   
      {   
      CArchive   ar(&file,CArchive::store);   
      ar<<(cb.index);   
      cb.ca.Serialize(ar);   
      //如果CB也定义Serialize,一行调用就可以了,但这两句还是要有(放在Serialize中)   
      ar.Close();   
      file.Close();   
      }   
      }   
        
      void   CAdoBlobDlg::OnButtonLoad()     
      {   
      CB   cb;   
      CFile   file;   
      if(file.Open("c:\\abc.dat",CFile::modeRead))   
      {   
      CArchive   ar(&file,CArchive::load);   
      ar>>cb.index;   
      cb.ca.Serialize(ar);   
      //如果CB也定义Serialize,一行调用就可以了,但无论怎么定义,这两行代码还是要有(放在Serialize中)   
      ar.Close();   
      file.Close();   
      }   
      

  5.   

    关于结构化存储的示例代码   
      /*   
      序列化就是对数据进行结构化存储,其存取过程都需要类CArchiver的对象   
      但对于数据,并不要求是不是由CObject派生,甚至是不是类都没关系   
      */   
      class   CA   
      {   
      public:   
      char   name[9];   
      BOOL   sex;   
      int   age;   
      CString   address;   
      public:   
      CA(){}   
      ~CA(){}   
      public:   
      void   Serialize(CArchive&ar);   
      };   
      void   CA::Serialize(CArchive&ar)   
      {   
      CString   text;   
      //   是不是类无关紧要,函数名是不是Serialize也无关紧要,紧要的只是要有CArchive对象   
      if(ar.IsStoring())//这个判断是自动进行的,因为创建CArchive对象时指定了是store还是load   
      {   
      text=name;/ ar*不能用(定义成CString就好了)   
      ar<<text<<sex<<age<<address;   
      }   
      else   
      {   
      ar>>text>>sex>>age>>address;   
      strcpy(name,text.GetBuffer(0));   
      }   
      }   
        
      class   CB   
      {   
      public:   
      int   index;   
      CA   ca;   
      public:   
      CB(){}   
      ~CB(){}   
      //没有定义Serialize(),但完全可以象CA那样定义   
      };   
        
      void   CAdoBlobDlg::OnButtonStore()     
      {   
      CB   cb;   
      cb.index=1;   
      strcpy(cb.ca.name,"王进");   
      cb.ca.sex=TRUE;   
      cb.ca.age=30;   
      cb.ca.address="济南";   
      CFile   file;   
      if(file.Open("c:\\abc.dat",CFile::modeWrite|CFile::modeCreate))   
      {   
      CArchive   ar(&file,CArchive::store);   
      ar<<(cb.index);   
      cb.ca.Serialize(ar);   
      //如果CB也定义Serialize,一行调用就可以了,但这两句还是要有(放在Serialize中)   
      ar.Close();   
      file.Close();   
      }   
      }   
        
      void   CAdoBlobDlg::OnButtonLoad()     
      {   
      CB   cb;   
      CFile   file;   
      if(file.Open("c:\\abc.dat",CFile::modeRead))   
      {   
      CArchive   ar(&file,CArchive::load);   
      ar>>cb.index;   
      cb.ca.Serialize(ar);   
      //如果CB也定义Serialize,一行调用就可以了,但无论怎么定义,这两行代码还是要有(放在Serialize中)   
      ar.Close();   
      file.Close();   
      }