MFC中有三种文件操作的类 CFile ,CArchive,CDocument

本文介绍了MFC中三种文件操作类:CFile、CArchive和CDocument的基本使用方法及特点。CFile适用于需要手动管理数据结构的情况;CArchive提供更高级的存取方式,支持直接操作变量;CDocument进一步简化操作流程,适用于文档驱动的应用。
MFC中有三种文件操作的类,他们分别为
  • CFile
  • CArchive
  • CDocument
下面分别对每个进行使用说明
(1)CFile在使用的时候比较麻烦,一般需要先定义一个结构体,然后对其每个结构体进行存储,存储实例代码如下:

 
void CTest1Dlg::OnSave()
{
static char szFilter[] = “Chart Files (.xlc)|.xlc|Worksheet Files (.xls)|.xls|Data Files (.xlc;.xls)|.xlc; .xls|All Files (.)|.||”;
CFileDialog fd(FALSE,”.txt”,”未命名”,OFN_OVERWRITEPROMPT);
if( IDCANCEL == fd.DoModal() )
{
return;
}
CString szPath = fd.GetPathName();
CFile file;
if( !file.Open(szPath,CFile::modeCreate|CFile::modeWrite,NULL))
{
AfxMessageBox(“文件打开失败!”);
return ;
}
int nCount = m_listCtrl.GetItemCount();
int i = 0;
INFO info;
while( i < nCount )
{
info.nNum = atoi(m_listCtrl.GetItemText(i,0));
strcpy(info.szName,m_listCtrl.GetItemText(i,1));
info.dSal = atof(m_listCtrl.GetItemText(i,2));
file.Write(&info,sizeof(info));
i++;
}
}

打开文件如下:

 
void CTest1Dlg::OnOpen()
{
CFileDialog fd(TRUE);
if( IDCANCEL == fd.DoModal() )
{
return;
}
CString szPath = fd.GetPathName();
CFile file;
if( !file.Open(szPath,CFile::modeRead,NULL))
{
AfxMessageBox(“文件打开失败!”);
return ;
}
m_listCtrl.DeleteAllItems();
int i = 0;
CString str;
while( sizeof(info) == file.Read(&info,sizeof(info)) )
{
str.Format(“%d”,info.nNum);
m_listCtrl.InsertItem(i,str);
m_listCtrl.SetItemText(i,1,info.szName);
str.Format(“%lf”,info.dSal);
m_listCtrl.SetItemText(i,2,str);
i++;
}
}

(2)CArchive类没有在MSDN中的类表中,不是CObject类的派生类,所以,即没有基类,但是相对于CFile 文件操作简单了少许其特点在于:
  • 不需要使用 固定大小的结构体对象作为存储单元进行存取
  • 数组存储无冗余,很紧凑,生成的文件大小是所有变量大小和字符串长度的和
  • 其使用>> << 重载运算符写和读操作,甚是灵活
其保存实例如下:

 
void CTest1Dlg::OnSave()
{
static char szFilter[] = “Chart Files (.xlc)|.xlc|Worksheet Files (.xls)|.xls|Data Files (.xlc;.xls)|.xlc; .xls|All Files (.)|.||”;
CFileDialog fd(FALSE,”.txt”,”未命名”,OFN_OVERWRITEPROMPT);
if( IDCANCEL == fd.DoModal() )
{
return;
}
CString szPath = fd.GetPathName();
CFile file;
if( !file.Open(szPath,CFile::modeCreate|CFile::modeWrite,NULL))
{
AfxMessageBox(“文件打开失败!”);
return ;
}
CArchive ca(&file,CArchive::store);
int nCount = m_listCtrl.GetItemCount();
int i = 0;
ca << nCount;
while( i < nCount )
{
ca << atoi(m_listCtrl.GetItemText(i,0));
ca << m_listCtrl.GetItemText(i,1);
ca << atof(m_listCtrl.GetItemText(i,2));
i++;
}
}

打开文件实例如下:

 
void CTest1Dlg::OnOpen()
{
CFileDialog fd(TRUE);
if( IDCANCEL == fd.DoModal() )
{
return;
}
CString szPath = fd.GetPathName();
m_doc.OnOpenDocument(szPath);
CFile file;
if( !file.Open(szPath,CFile::modeRead,NULL))
{
AfxMessageBox(“文件打开失败!”);
return ;
}
m_listCtrl.DeleteAllItems();
int i = 0,nCount;
CString str;
CArchive ca(&file,CArchive::load);
int num;CString szName;double dSal;
ca >> nCount;
while( i< nCount )
{
ca >> num;
str.Format(“%d”,num);
m_listCtrl.InsertItem(i,str);
ca >> szName;
m_listCtrl.SetItemText(i,1,szName);
ca >> dSal;
str.Format(“%f”,dSal);
m_listCtrl.SetItemText(i,2,str);
i++;
}
}

(3)CDovument类更是简化了上述操作,支持标准操作,如创建、装载、保存等。框架用CDocument定义的界面来操作文档,其封装Serialize(CArchive &ca)函数进行文件的读写操作,实例读文件操作:

 
void CTest1Dlg::OnOpen()
{
CFileDialog fd(TRUE);
if( IDCANCEL == fd.DoModal() )
{
return;
}
CString szPath = fd.GetPathName();
m_listCtrl.DeleteAllItems();
m_doc.OnOpenDocument(szPath);
}

保存文件操作:

 
void CTest1Dlg::OnSave()
{
static char szFilter[] = “Chart Files (.xlc)|.xlc|Worksheet Files (.xls)|.xls|Data Files (.xlc;.xls)|.xlc; .xls|All Files (.)|.||”;
CFileDialog fd(FALSE,”.txt”,”未命名”,OFN_OVERWRITEPROMPT);
if( IDCANCEL == fd.DoModal() )
{
return;
}
CString szPath = fd.GetPathName();
m_doc.OnSaveDocument(szPath);
}

然后调用Serialize(CArchive &ca)函数进行撒谎书类似CArchive类的操作
好了,这就是上述三种类的简单介绍,
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值