我有个结构体是这样的
typedef struct tagPICSHOWDATAINFO
{
  //基本信息
  double dStartFreq; //起始频率
  TCHAR strStartFreqUnit[nMAX_LENTH]; //起始频率单位
  std::vector<TKLIMITELINE> lstMaxLim; //合格上限  ......
}PICSHOWDATAINFO, *PPICSHOWDATAINFO;变量 PICSHOWDATAINFO info;
lstMaxLim个数不定,直接用CFile类保存为
CFile file;
file.Open(_T("F:\\11.txt"), CFile::modeCreate|CFile::modeWrite);
file.Write(&info, sizeof(info));
file.Flush();
file.Close();
然后读取时
PICSHOWDATAINFO picData;
memset(&picData, 0, sizeof(PICSHOWDATAINFO));
CFile file;
file.Open(_T("F:\\11.txt"), CFile::modeRead);
file.Read(&picData, sizeof(picData));
file.Close();lstMaxLim数据是错误的,原因是将指针保存下来,而实际内容并没有保存,如果遇到这样的结构体该怎么读写呢?或者怎么修改一下这样子的结构体呢?
有人说需要将结构中的成员逐个写入,对于vector,要得到每个成员,然后分别写入文件。 这样怎么写?又如何读呢?请高手指示,最好能写一下读写的代码。谢谢!

解决方案 »

  1.   

    file.Write(&info.dStartFreq, sizeof(info.dStartFreq));
    file.Write(&info.strStartFreqUnit, sizeof(info.strStartFreqUnit));
    file.Write(&(info.lstMaxLim[0]), sizeof(TKLIMITELINE)*info.lstMaxLim.size() ); ..读的时候也差不多,不过你得知道lstMaxLim有多少个才能读
      

  2.   

    file.Read(&picData, sizeof(picData));
    这样写显然是不行的,有的能保存为数据,有些保存的就是地址。
    需要将链表类的或者指针类的数据单独循环保存出来
      

  3.   

    有人说需要将结构中的成员逐个写入,对于vector,要得到每个成员,然后分别写入文件。 这样怎么写?又如何读呢?
    -----------------------
    vector<...>::const_iterator 迭代取出成员得到相对应的数据,然后依次写入文件中
      

  4.   

    感觉楼主真的很累,迭代器你都不懂,你怎么就会用迭代器这个东西呢?从迭代器中逐个元素读取,然后write到文件,这个你也理解不了???
    再问下去,就得从1+1为什么等于2开始讲了。
      

  5.   

    file.Write(&info.dStartFreq, sizeof(info.dStartFreq));
    file.Write(&info.strStartFreqUnit, sizeof(info.strStartFreqUnit));
    for(int i=0; i<info.lstMaxLim.size();i++)
       file.Write(&(info.lstMaxLim[i]), sizeof(TKLIMITELINE));读的时候要一个一个读出来,然后再用Push_back加入到Vector中
      

  6.   


    这样写是不行的,因为有一个结构体TKLIMITELINE里面的东西我们不知道,他是文本文件会乱码或者中间出现0折断文件的。
    如果是文本文件,建议你用CArchive来减轻你的工作。如果你不知道std::vector怎么用那你为什么不用MFC的CArray或者ATL的CAtlArray呢,赶时髦?
    不要以为STD的就是好东西,我就不喜欢用std::string,因为它不支持MBCS,还有额外引入一个新库会增加一些不确定性,我认为使用MFC或者ATL完全没有必要使用STD。做程序的不能指望人家把代码写好给你,别人能指出一个正确方向就已经很不错了。
      

  7.   

    这种复杂结构体最好用一种序列化的方式写文件
    比如xml
    然后读出来的时候按着约定生成需要的对象
      

  8.   

    是啊,工欲善其事,必先利其器。你的器差的多,怎么能做好事呢。
    问答式的论坛的缺陷就是不能深入交流。直接对话才能解决问题。而对你来说,与其这么等待,不如赶紧学习vector的使用,知道什么是迭代器......
      

  9.   

    for (vector<TKLIMITELINE>::const_iterator iter = lstMaxLim.begin();  iter != lstMaxLim.end(); ++ iter) 
    //Write时还不是依次写入,不能整体写入?
    那读取时也是要依次读取了?
      

  10.   


    我是想如果依次写入 依次读取的话那我把vector从这个结构体中拿出去,那么读写不就简单点了么结构体没有指针可以直接读写,然后对这个特殊的变量再一次读写
      

  11.   

            1)继承CObject做节点类,比如如: class xx : public CObject
             2)修改对应的xx
            3)xx必须要有一个serilize涵数
             4)在你的doc类中增加:
              CTypedPtrArray <CObArray, xx*> m_Relate4Array;
            5)在Save和load函数务必加上:
               
              save()
            { m_Relate4Array.Serialize(ar);}
             load()
            { m_Relate4Array.Serialize(ar);}以上的具体道理要详细看喉杰的书,明白?
           
     
      

  12.   

    用c里面的   fread     fwrite