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

来源:互联网 发布:韩顺平java全套视频 编辑:程序博客网 时间:2024/05/21 11:09
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类的操作
好了,这就是上述三种类的简单介绍,
原创粉丝点击