如何使用序列化方法从文件中读取数据到一个结构体中??即刻给分!!!!!!!!!!!

MSFan 2001-12-30 07:10:31
如何使用序列化方法从文件中读取数据到一个结构体中??即刻给分!!!!!!!!!!!
...全文
477 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
MSFan 2001-12-31
  • 打赏
  • 举报
回复
uu
lanzhengpeng2 2001-12-30
  • 打赏
  • 举报
回复
什么是流式文件储存?

简单的说,从当前文件位置,读和写按照完全相同的方式把数据读或写到文件中。
例如 class A -> file, class B -> file
file -> class A, file -> class B
A,B只要按照上面的方式做好自己的流式文件储存就是了。
这样的优点是:高效,简单
缺点是:某个数据的位置非常难确定

什么叫做序列化?

就是某个数据按照 流式文件储存 方式将数据写和读的操作
具体到VC和这个例子:
一:没有CArchive类的支持
Write:
int n = str.GetLength;
pFile->Write(&n,sizeof(n));
pFile->Write((LPCSTR)m_cc.name,n);
pFile->Write(&m_cc.course,sizeof(m_cc.course));
pFile->Write(&m_cc.sub,sizeof(m_cc.course));

Read:
int n;
pFile->Read(&n,sizeof(n))
if(n > 0)
pFile->Read(str.GetBufferSetLength(n),n);
str.ReleaseBuffer(); //这个函数是必须的,我曾经在这里犯了不少错误
pFile->Read(&m_cc.course,sizeof(m_cc.course));
pFile->Read(&m_cc.sub,sizeof(m_cc.course));

这个结构体的序列花就完成了。如果想要更好的封装,如下:
struct student
{
CString name;
int course;
char sub[6];
CFile & Read( const CFile & File );
CFile & Write( const CFile & File );
}abc;
将上面的代码移到这两个函数里并把 File 返回,则这个类的序列化就完美完成了。
abc a1,a2,a3;
a1.Write(file);a2.Write(file);a3.Write(file);
a1.Read(file);a2.Read(file);a3.Read(file);

二:有CArchive类的支持
这几乎没有什么说的,因为CArchive已经重载了常见数据类型的序列化操作,包括CString,你要做的是:
写一个Serlize(没有拼写错吧?!)函数,跟CDocument的申明一样,然后
.....
{
if(ar.IsStoring())
{
ar << name;
ar << course;
for(int i=0;i<6;i++)
ar << sub[i];
}
else
{
ar >> name;
ar >> course;
for(int i=0;i<6;i++)
ar >> sub[i];
}
}
外部只需要调用Serlize就可以了。
进一不,你可以重载操作符 << 和 >>,这样外部的使用更简单了:
friend CArchive & operator << ( struc & abc, CArchive & ar );
friend CArchive & operator >> ( struc & abc, CArchive & ar );

你可能要问的问题:
一:不记录或读取CString的长度行不行。
回答:行,那么,在读取时你只有一个字节一个字节的读取判断是否读完了一个字符串。低效,复杂。
二:直接将 abc 写或读入行不行。file.Write(&m_cc,sizeof(m_cc));
回答:不行。这个问题你已经意识到了。为什么?CString里有个指针,写时并不能把字符串内容写入到文件,只是写入了一个指针。读时只是读入了上次的指针内容,并没有把字符串读入,而且继续操作要出问题,因为上次的指针地址不见得这次能用。

kingzai 2001-12-30
  • 打赏
  • 举报
回复
按我上面这种方法,
在定义一个CArray,最后将读出来的数据加到这个Array中,不难呀。
参考以下代码
for(UINT i=0;i<m_Flow.nParamNum;i++)
{
ar>>param.strLeader;
ar>>param.bOutput;
ar>>param.strParamType;
ar>>param.strParamName;
ar>>param.strDefault;
ar>>param.strParamNote;
// m_Flow.arrayParam.Add(param);
ProcInfo.pParam->Add(param);

}
MSFan 2001-12-30
  • 打赏
  • 举报
回复
在View类中使用序列化方法从文件aa.txt中读取数据到这个结构体 m_cc 中

MSFan 2001-12-30
  • 打赏
  • 举报
回复
举个例子好不好??

struct student
{
CString name;
int course;
char sub[6];
}abc;
abc m_cc;


下面在View类中使用序列化方法从文件aa.txt中读取数据到一个结构体中

…………



kingzai 2001-12-30
  • 打赏
  • 举报
回复
CFile file;
CArchive ar(&file,CArchive::load);
CFile* pFile=ar.GetFile();
// 取文件头
ar>>m_Flow.headInfo.nSign;
ar>>m_Flow.headInfo.nVersion;
...
wyzegg 2001-12-30
  • 打赏
  • 举报
回复
结构体就是类。重载Serialize函数就行了
skyspeed 2001-12-30
  • 打赏
  • 举报
回复
你将结构体换成类,在类中重载Serialize函数就行了
可再由类成员变量生成结构体呀

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧