我有个结构体是这样的
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,要得到每个成员,然后分别写入文件。 这样怎么写?又如何读呢?请高手指示,最好能写一下读写的代码。谢谢!
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,要得到每个成员,然后分别写入文件。 这样怎么写?又如何读呢?请高手指示,最好能写一下读写的代码。谢谢!
解决方案 »
- 送分题!
- ATL控件Image序列化问题
- 设备路径与设备名称的区别
- 求助,托盘程序右键菜单定位。
- 刚学习ADO,有些简单的问题不太明白,希望大家指教
- 有空的朋友,帮我想想界面创意。学了好几个月Vc了,如今想做个程序
- 一个 Windows Sockets 网络编程的方案...
- 求助,WCDMA UI 显示 “未检测到SIM(USIM)卡或卡已无效”
- MFC中的图片显示问题
- 请问虾们:DLL,COM,ACTIVEX,ATL都是干啥子用的?有何区别?学习VC必须掌握这些东东吗?多谢!!!
- 怎么获取窗体后的背景图
- 不显示删除回复显示所有回复显示星级回复显示得分回复 求助,出现错误,大神指点一下……不胜感激
file.Write(&info.strStartFreqUnit, sizeof(info.strStartFreqUnit));
file.Write(&(info.lstMaxLim[0]), sizeof(TKLIMITELINE)*info.lstMaxLim.size() ); ..读的时候也差不多,不过你得知道lstMaxLim有多少个才能读
这样写显然是不行的,有的能保存为数据,有些保存的就是地址。
需要将链表类的或者指针类的数据单独循环保存出来
-----------------------
vector<...>::const_iterator 迭代取出成员得到相对应的数据,然后依次写入文件中
再问下去,就得从1+1为什么等于2开始讲了。
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中
这样写是不行的,因为有一个结构体TKLIMITELINE里面的东西我们不知道,他是文本文件会乱码或者中间出现0折断文件的。
如果是文本文件,建议你用CArchive来减轻你的工作。如果你不知道std::vector怎么用那你为什么不用MFC的CArray或者ATL的CAtlArray呢,赶时髦?
不要以为STD的就是好东西,我就不喜欢用std::string,因为它不支持MBCS,还有额外引入一个新库会增加一些不确定性,我认为使用MFC或者ATL完全没有必要使用STD。做程序的不能指望人家把代码写好给你,别人能指出一个正确方向就已经很不错了。
比如xml
然后读出来的时候按着约定生成需要的对象
问答式的论坛的缺陷就是不能深入交流。直接对话才能解决问题。而对你来说,与其这么等待,不如赶紧学习vector的使用,知道什么是迭代器......
//Write时还不是依次写入,不能整体写入?
那读取时也是要依次读取了?
我是想如果依次写入 依次读取的话那我把vector从这个结构体中拿出去,那么读写不就简单点了么结构体没有指针可以直接读写,然后对这个特殊的变量再一次读写
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);}以上的具体道理要详细看喉杰的书,明白?