相关类
CFile-文件操作类,封装了关于文件读写等操作
CFile::Open
CFile::Write/Read
CFile::Close
CFile::SeekToBegin / SeekToEnd / Seek
代码示例
#include <afxwin.h>
#include <iostream>
using namespace std;
void File() {
CFile file;
file.Open("E:/MFC/MFCDay02/file.txt",CFile::modeCreate | CFile::modeReadWrite);
char str[] = "hello file";
file.Write(str,strlen(str));
file.SeekToBegin();
char buf[256] = { 0 };
long nLen = file.Read(buf,256);
cout << buf << ' ' << nLen << endl;
}
int main() {
File();
return 0;
}
序列化机制的作用
以二进制流形式读写硬盘文件,但效率很高。
CFile文件操作类,完成硬盘文件的读写操作。
CArchive-归档类,完成内存数据的读写操作。
序列化变量
序列化机制的使用
- 创建或打开文件 CFile::Open
- 定义归档类对象 CArchive ar
- 数据序列化 ar << 数据
- 关闭归档类对象 ar.Close()
- 关闭文件 CFile::Close();
反序列化机制的使用
- 打开文件 CFile::Open
- 定义归档类对象 CArchive ar
- 数据反序列化 ar >> 变量
- 关闭归档类对象 ar.Close()
- 关闭文件 CFile::Close();
代码示例
#include <afxwin.h>
#include <iostream>
using namespace std;
//序列化
void Store() {
CFile file;
file.Open("E:/MFC/MFCDay02/serial.txt", CFile::modeCreate | CFile::modeWrite);
CArchive ar(&file, CArchive::store,4096);
long age = 18;
ar << age;
float score = 88.5;
ar << score;
CString name = "zhangsan";
ar << name;
ar.Close();
file.Close();
}
//反序列化
void Load() {
CFile file;
file.Open("E:/MFC/MFCDay02/serial.txt", CFile::modeRead);
CArchive ar(&file, CArchive::load, 4096);
long age;
ar >> age;
float score;
ar >> score;
CString name;
ar >> name;
cout << "age " << age << " score " << score <<" name "<< name << endl;
}
int main() {
//Store();
Load();
return 0;
}
序列化对象的使用
- 类必须派生自CObject
- 类内必须添加声明宏 DECLARE_SERIAL(theClass)
- 类外必须添加实现宏 IMPLEMENT_SERIAL(theClass,baseClass,1)
- 类必须重写虚函数Serialize
当类具备上述三个要件后,类对象就可以序列化到文件中保存了。
#include <afxwin.h>
#include <iostream>
using namespace std;
//1.类必须派生自CObject
class CMyDoc :public CDocument {
//2.类内必须添加声明宏 DECLARE_SERIAL(theClass)
DECLARE_SERIAL(CMyDoc)
public:
CMyDoc(int age = 0, float score = 0.0, CString name = "") :
m_age(age), m_score(score), m_name(name) {
};
int m_age;
float m_score;
CString m_name;
//4.类必须重写虚函数Serialize
virtual void Serialize(CArchive& ar);
};
//3.类外必须添加实现宏 IMPLEMENT_SERIAL(theClass,baseClass,1)
IMPLEMENT_SERIAL(CMyDoc,CDocument,1)
void CMyDoc::Serialize(CArchive& ar) {
if (ar.IsStoring()) {
ar << m_age << m_score << m_name;
}
else {
ar >> m_age >> m_score >> m_name;
}
}
void Store() {
CFile file;
file.Open("E:/MFC/MFCDay02/serial.txt", CFile::modeCreate | CFile::modeWrite);
CArchive ar(&file, CArchive::store, 4096);
CMyDoc data(18, 88.5, "zhangsan");
ar << &data;
ar.Close();
file.Close();
}
void Load() {
CFile file;
file.Open("E:/MFC/MFCDay02/serial.txt", CFile::modeRead);
CArchive ar(&file, CArchive::load, 4096);
CMyDoc* pdata = NULL;
ar >> pdata;
ar.Close();
file.Close();
cout << pdata->m_age <<' ' << pdata->m_score << ' ' << pdata->m_name << endl;
}
int main() {
//Store();
Load();
return 0;
}