CArchive 和 CFile 都是MFC的类, 头文件afx.h 定义的.CFile直接同磁盘文件打交道,直接读写,无缓冲存储. CArchive可以做比CFile更多的事.建CArchive对象前必须先建CFile对象,CArchive要用到CFile对象. 将保存于文件中的short数据保存到short数组,就是打开磁盘文件,读入数据. CFile支持直接binary读写,间接text读写. 我觉得用CArchive方便. 如果你只读写二进制文件,用CFile也可以
文件读写的最普通的方法是直接使用CFile进行,如文件的读写可以使用下面的方法:
//对文件进行读操作
char sRead[2];
CFile mFile(_T("user.txt"),CFile::modeRead);
if(mFile.GetLength()<2)
return;
mFile.Read(sRead,2);
mFile.Close();
//对文件进行写操作
CFile mFile(_T("user.txt "), CFile::modeWrite|CFile::modeCreate);
mFile.Write(sRead,2);
mFile.Flush();
mFile.Close();
虽然这种方法最为基本,但是它的使用繁琐,而且功能非常简单。CArchive的使用方法简单且功能十分强大。首先还是用CFile声明一个对象,然后用这个对象的指针做参数声明一个CArchive对象,你就可以非常方便地存储各种复杂的数据类型了。它的使用方法见下例。
//对文件进行写操作
CString strTemp;
CFile mFile;
mFile.Open("d://dd//try.TRY",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);
CArchive ar(&mFile,CArchive::store);
ar< ar.Close();
mFile.Close();
//对文件进行读操作
CFile mFile;
if(mFile.Open("d://dd//try.TRY",CFile::modeRead)==0)
return;
CArchive ar(&mFile,CArchive::load);
ar>>strTemp;
ar.Close();
mFile.Close();
CArchive的 << 和 >> 操作符用于简单数据类型的读写,对于CObject派生类的对象的存取要使用ReadObject()和WriteObject()。使用CArchive的ReadClass()和WriteClass()还可以进行类的读写,如:
//存储CAboutDlg类
ar.WriteClass(RUNTIME_CLASS(CAboutDlg));
//读取CAboutDlg类
CRuntimeClass* mRunClass=ar.ReadClass();
//使用CAboutDlg类
CObject* pObject=mRunClass->CreateObject();
((CDialog* )pObject)->DoModal();
如果你要进行的文件操作只是简单的读写整行的字符串,使用CStdioFile,用它来进行此类操作非常方便,如下例。
CStdioFile mFile;
CFileException mExcept;
mFile.Open( "d://temp//aa.bat", CFile::modeWrite, &mExcept);
CString string="I am a string.";
mFile.WriteString(string);
mFile.Close();
1、CFile主要封装了对文件的操作,你可以用此类的成员函数对一个文件进行各种操作(打开、关闭、往文件里写内容、从文件里读取内容等等)。
2、CFile有时很笨拙,可以用类CArchive代替它来对文件的内容进行读写,CArchive封装了读写操作符: << 和 >> ,这两个操作符使得读写文件的内容变得相当的直接与简单,如:
CFile file;
//打开一个文件
CArchive ar(&file , CArchive::store);
ar << 1;
ar << 1.3545;
这样就向一个文件中写入了1和1.3545。
要读的话同样很简单(这里就不多说,不知道的话可以参考MSDN)
3、但如果我们要使用上面两个操作符直接往一个文件中写入一个类的对象或从一个文件中读入一个类的对象,这时候该怎么办呢,对,Serialize派上用场了。首先这个类必须继承自CObject,Serialize就是CObject的一个虚拟函数,你的类必须重载这个函数。如下面
CYourClass : public CObject
{
DECLARE_SERIAL(CYourClass) //很重要一定要加上
public :
virtual void Serialize(CArchive& ar);
public :
int m_iVal;
float m_fVal;
};
在实现文件中:
IMPLEMENT_SERIAL(CYourClass , CObject , 1)
void CYourClass::Serialize(CArchive& ar)
{
if(ar.IsLoading())
{
//从文件中读取数据到内存中,比如
ar >> m_iVal;
ar >> m_fVal;
}
else if(ar.IsStoring())
{
ar << m_iVal;
ar << m_fVal;
}
}
之后你就可以利用CArchive类的两个操作符直接把一个类对象的内容写入文件中,或者从一个文件中读取数据初始化这个类了,如:
CFile file;
//打开一个文件
CArchive ar(&file , CArchive::store);
CYourClass yc;
yc.m_iVal = 2;
yc.m_fVal = 12.34;
ar << 1;
ar << 23.34;
ar << yc;
要读数据出来跟上面类似(具体的请查看MSDN)。