我需要存储文件的配置信息到硬盘中,不用数据库,工程是基于dialog的,存储的是自定义的一个数据结构数组,
数据结构LINKINFO中存有CSTRING二重数组和INT二重数组,有没有比较简单的方法存储,目前LINKINFO类继承CObject
但CSTRING数组和INT数组不能直接CArchive,怎么解决。另外LINKINFO数组该如何保存至硬盘中,又该怎样读出。
是否有更简单的方法 不需要用MFC的serilize机制.
数据结构LINKINFO中存有CSTRING二重数组和INT二重数组,有没有比较简单的方法存储,目前LINKINFO类继承CObject
但CSTRING数组和INT数组不能直接CArchive,怎么解决。另外LINKINFO数组该如何保存至硬盘中,又该怎样读出。
是否有更简单的方法 不需要用MFC的serilize机制.
如果不用串行化,可以自己把字符串长度和内容储存到文件,例如用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();
}
/*
序列化就是对数据进行结构化存储,其存取过程都需要类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();
}