MFC中关于文件的读取和存储(使用CFile与CFileDialog类)

    在这里我记录一下如何读取和存储一个文件!

   这里以读取一个txt文档为例。

   我首先建立了一个单文档应用程序,在View处理LBUTTONDOWN的消息,即左鼠标键按下,打开一个文件。当然这里是为了图方便省事!

   处理代码如下:

void CSDIView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	CFileDialog  fileDlg(TRUE);//这里的true表示是文件打开对话框,FALSE的话会变成文件保存对话框

	fileDlg.m_ofn.lpstrFilter = "Text Files(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0";//这里是文件过滤符
	if (IDOK == fileDlg.DoModal())
	{
		CFile iifile(fileDlg.GetFileName(), CFile::modeRead);
		
		int nLen = iifile.GetLength();//首先获取数据长度
		char *pBuf = new char[nLen + 1];//在堆里开辟一块内存
		pBuf[nLen] = 0;//最后一个字符置零,方便输出
		iifile.Read(pBuf, nLen);//读出字符
		MessageBox(pBuf);//通过对iifile读取字符
		delete []pBuf;//删除不需要的内存,防止内存泄露
	}
	
	
	CView::OnLButtonDown(nFlags, point);
}


    在这里解释一下函数就可以了!

   1.CFile(LPCTSTR lpFileName,UINT nOpenFlags); 
       Throw(CFileException);


       lpFileName:文件名称,可以是相对路径,绝对路径或者网络路径

       nOpenFlags:文件打开方式,有以下几种:

       CFile::modeCreate 构造新文件,如果文件存在,则长度变为0
       CFile::modeNoTruncate 该属性和modeCreate联合使用,可以达到如下效果:如果文件存在,则不会将文件的长度置为0,如果不存在,则会由modeCreate属性来创建一个新文件。
       CFile::modeRead   以只读方式打开文件
       CFile::modeWrite   以写方式打开文件
       CFile::modeReadWrite 以读、写方式打开文件
       CFile::modeNoInherit 阻止文件被子进程继承
       CFile::shareDenyNone 不禁止其它进程读写访问文件,但如果文件已经被其它进程以兼容模式打开,则创建文件失败。
       CFile::shareDenyRead   打开文件,禁止其它进程读此文件,如果文件已经被其它进程以兼容模式打开,或被其它进程读,则create失败。
       CFile::shareDenyWrite 打开文件,禁止其它进程写此文件,如果文件已经被其它进程以兼容模式打开,或被其它进程写,则create失败。
       CFile::shareExclusive   以独占模式打开文件,禁止其它进程对文件的读写,如果文件已经被其它模式打开读写(即使是当前进程),则构造失败。
       CFile::shareCompat    此模式在32位MFC中无效,此模式在使用CFile::Open时被映射为CFile::ShareExclusive。
       CFile::typeText        对回车、换行设置特殊进程(仅用于派生类)
       CFile::typeBinary      设置二进制模式(仅用于派生类)

       当然很属性都不常用,常用的就CFile::modeRead(读),CFile::modeCreate(创建),CFileWrite(写).

       2.virtual UINT Read(void* lpbuf,UINT nCount);
throw(CFileException);

   该函数返回读到缓冲区的字节长度,注意:对于读入到文件尾部,则返回的字节长度会小于、等于nCount的值。该函数表示从当前位置读入nCount个字节的内容到lpbuf缓冲区。

   上面的的函数先在堆里分配出一块内存做缓冲区,然后写到缓冲区里面!最后一定要记得删除那块数据,C++不会帮你删除,只能自己动手!

       3.CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL )

    这个函数是CFileDialog的构造函数,很多都已经有默认参数了,当然,自己亦可以修改!

       bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框。 
       lpszDefExt 指定默认的文件扩展名。 
       lpszFileName 指定默认的文件名。 
       dwFlags 指明一些特定风格。如果在参数中指定了“OFN_ALLOWMULTISELECT”风格,则在此对话框中可以进行多选操作。
       lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。参数格式如: 
"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; pos ) 对于选择了多个文件的情况得到下一个文件位置,并同时返回当前文件名。但必须已经调用过POSITION CFileDialog::GetStartPosition( )来得到最初的POSITION变量。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值