在mfc中,框架本身给我提供了一个文件的保存和读取文件的函数Serialize,但是学习过mfc的同学可能都会有一点疑惑,就是在所现在的资料中基本都是通过
1把自己希望保存的类Myclass进行可串行化,具体步骤有1.。。。。5步,CSDN到处都有着方法我就不赘述了。
2.在Cxxxdoc类的重写虚函数Cxxxdoc::Serialize(),因为在函数是每次保存和打开文进必定会进入的.。然后可以在其中进行很多的写入和读取,当然如果你是看了孙鑫老师的《VC深入详解》,那这些肯定没问题,甚至还会后面的直接调用OCject::Serialize()实现数据的保存和读取。
!!!!!!!但是这又个问题,基本上所有的教材都绕不开Cxxxdoc,但是你如果建立的工程不是单文档应用程序,而是基于对话框建立的你就知道绝望了,但是这不是最绝望的,因为你还是可以建立Cxxxdoc,来重写Cxxxdoc::Serialize(),但是当我运行程序DEGUB时,发现进不去这个函数了。。进不去了。。。。。。 现在我又必须实现这个功能,如果是刚刚学习MFC的同学肯定会去网上翻阅大堆的东西,然后在头晕目眩,各家纷说中熬混了头。但是只要你进来了我这,恭喜你终于可以走上正轨了。
我们现在可以愉快的开始了
1.首先你需要对你需要保存数据的CLASS进行可串行化。
(1)class CHar : public CObject//继承类
(2)DECLARE_SERIAL(CHar)//串行化
(3)CHar(const CHar &user);//此处用于与赋值的构造函数
CHar(void);//构造函数
(4)
IMPLEMENT_SERIAL(CHar,CObject,1)
(5)
void CHar::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// 'store' data
ar << m_strName< m_strPassword;
}
else
{
// 'load' data
ar >> m_strName>> ar >> m_strPassword;
}
#pragma once
#include "afx.h"
class CHar : public CObject
{
DECLARE_SERIAL(CHar)//串行化
public:
CHar(void);
CHar(const CHar &user);
CHar &operator=(const CHar &user);
~CHar(void);
virtual void Serialize(CArchive& archive);
CString m_strName;
CString m_strPassword;
};
#include "StdAfx.h"
#include "Har.h"
IMPLEMENT_SERIAL(CHar,CObject,1)
/* Copy-constructor */
CHar::CHar(const CHar &useracount)
{
m_strName = useracount.m_strName;
m_strPassword = useracount.m_strPassword;
}
/* = operator definition */
CHar& CHar::operator=(const CHar &useracount)
{
if (&useracount != this)
{
m_strName = useracount.m_strName;
m_strPassword = useracount.m_strPassword;
}
return *this;
}
CHar::CHar(void)
{
}
CHar::~CHar(void)
{
}
void CHar::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// 'store' data
ar << m_strName<> m_strName>>m_strPassword;
}
}
2.你不要固定化思维,保存一定要在Cxxxdoc::Serialize()中实现,其实我们保存东西需要的是void XXX::Serialize(CArchive& ar)中的CArchive& ar,这个地方你只要ar>>,或者ar<<就行了。因为我们创建的是基于对话框的应用程序,所有没有Cxxxdoc::Serialize()。此时记住不要固话思维,其实我们要的就是调用CALSS里面的Serialize,所有你直接进入你的住对话框。创建连个按键(添加两个菜单也行),我用的是菜单。
3、在主对话框上面添加#include "xxx.h"你的CLASS类。
//保存按键
void CCHATDlg::OnWrite()
{
//m_obarry是定义在你此头文件的一个CObArray m_obarry用来保存数组
CHar useraccount[3];
useraccount[0].m_strName = _T("name1");
useraccount[0].m_strPassword = "123456";
m_obarry.Add(&useraccount[0]);
useraccount[1].m_strName = _T("name2");
useraccount[1].m_strPassword = "123456";
m_obarry.Add(&useraccount[1]);
useraccount[2].m_strName = _T("name3");
useraccount[2].m_strPassword = "123456";
m_obarry.Add(&useraccount[2]);
CFile file;
file.Open( "users.dat", CFile::modeWrite|CFile::modeCreate );//把数据写到users.dat这个文件中
CArchive ar(&file,CArchive::store);
int nCount=3; //注意这个数据要先写到文件中,因为据时要先读到这个数据,不然不知道读几条数据!
ar << nCount;
for (int i=0; i < m_obarry.GetSize(); i++)
{
useraccount[i].Serialize(ar);
}
ar.Flush();
ar.Close();
file.Close();
CString m_str;
GetDlgItem(IDC_EDIT_SEND)->GetWindowText(m_str);
MessageBox(m_str);
}
//读取按键
void CCHATDlg::OnRead()
{
CFile file;
file.Open( "users.dat", CFile::modeRead );
CArchive ar(&file,CArchive::load);
int nCount;
ar >> nCount;
for(int i=0; i
在这里你可以看到我们调用的Serialize(ar)函数,就是刚刚那个类CLASS的成员函数。就进入了void XXX::Serialize(CArchive& ar)。此时你可以观察现象。
你只要进行上面的步骤就可以实现文件的保存和读取了,此处引用于https://blog.csdn.net/bcypxl/article/details/17637783
另外我自己有个小程序,集多线程网络聊天,菜单与对话款结合,DEBUGprintf输出,数据保存,IP以及用户名设置的小程序,如果有需求或者想加深下对MFC的学习可以查看(https://download.csdn.net/download/qq_39200996/11129230)
!!里面代码有我的详细注释以及自己的一些理解,毕竟我当时也遇到了很多莫名其妙的问题,希望对你有很大的帮助