MFC文件的保存和提取

4 篇文章 0 订阅
1 篇文章 0 订阅

在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_strPassword;
	}
	else
	{
		// 'load' data
		ar >> 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<nCount; i++)
	{	
		CHar useraccount;
		// get user data
		useraccount.Serialize(ar);
        /****************类型装换******************/
		CString string;
		string.Format("%u",useraccount.m_strPassword);
		/******************************************/
		//AfxMessageBox(useraccount.m_strName+_T(" ")+str);//取消注释可以验证

	}
    ar.Close();
    file.Close();
}

在这里你可以看到我们调用的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

!!里面代码有我的详细注释以及自己的一些理解,毕竟我当时也遇到了很多莫名其妙的问题,希望对你有很大的帮助

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值