MFC实现文本文件的基本操作

几乎每个软件都有"打开"、’'保存"的功能。以“记事本为打开功能”为例,其打开对话画框的界面如下:
在这里插入图片描述//截图
其保存对画框,与打开对话框界面基本一样,下面也给程序增加这样的对话框,我们可以使用MFC提供的CFileDialog类来完成;

CFileDialg类

CFileDialog类封装了Windows常用的文件对话框。常用的文件对话框提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能,该类的派生层次如下:
在这里插入图片描述
从上图中,可以看出这个类也是对话框的类,显示对话框可以使用DoModal函数来完成;
要使用CFileDialog,需要先用CFileDialog构造函数构造一个对象,其构造函数如下:

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

参数:
bOpenFileDialg

   如果为TRUE, 则创建文件打开对话框;如果为FALSE,则构造一个File Save As(另存为)对话框。  

lpszDefExt

   缺省文件扩展名,如果用户在文件名编辑框中不包含扩展名,则lpszDefExt定义的扩展名自动加到文件名后。如果为NULL,则不添加扩展名。  

lpszFileName

    初始显示于文件名编辑框中的文件名,如果为NULL,则不显示初始文件名。  

dwFlags

      一个或多个标志的组合,使你可定制对话框。如果你改变m_ofn.Flags结构成员,在改变中用OR操作保持缺省行为完整。  

lpszFilter

     一列字符串对,指定可以应用到文件的过滤器。如果指定过滤器,仅被选择的文件显示于文件列表框中。

pParentWnd

      指向文件对话框对象的父窗口或拥有者窗口。  

其中lpszFilter是个很重要的一个参数,想要完成文件过滤显示功能,需要对这个参数进行赋值;

其格式说明如下:

双字符串的第一个字符串描述过滤器,第二个串表明使用的文件扩展名,多重扩展可用“;”来指定。字符串由两个“|”字符结尾;

如果lpszFilter不是以默认构造形式赋值,而是通过m_ofn.lpszFilter形式赋值,我们需要将过滤器字符串中的“|”替换成”\0“;

形如:

CFileDialog fdlg(FALSE, NULL, _T("*.txt"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
		, _T("文本文件(*.txt)|*.txt|C++ source file(*.h; *.c; *.cpp)|*.h; *.c; *.cpp | 视频文件(*.avi) | *.avi | 所有文件(*.*) | *.* || "));
	
TCHAR szFilters[] = 
    "C++ source file(*.h;*,hpp;*.cpp)\0*.h;*.hpp;*.cpp\0"\
    "Text File(*.txt)\0*.txt\0"\
    "All Typle(*.*)\0*.*\0" \
    "Lua source file(*.lua)\0*.lua\0"\
    "\0";

如果想对对话框作更多定制,我们可通过成员数据m_ofn对对话框进行更多赋值,该参数是Windows OPENFILENAME结构,更多信息参照网上介绍

OnBnClickedOpen()函数实现:

添加控件后的事件


/****************************************************************
*函数名称: 打开对话框
*功    能: 打开选择的文本文件
*作    者:kiki
*日    期:2019/5/7
****************************************************************/
void CDay506Dlg::OnBnClickedOpen()
{
	//定义文件对话框
	CFileDialog fdlg(TRUE, NULL, _T("*.*"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
		, _T("文本文件(*.txt)|*.txt|视频文件(*.avi)|*.avi|所有文件(*.*)|*.*||"));
	if (IDCANCEL == fdlg.DoModal())
	{
		return;
	}
	//读取当前对话框选择的文件路径
	CString strPathName = fdlg.GetPathName();
	//读取路径名到编辑框
	SetDlgItemText(IDC_EDIT1, strPathName);

	//打开选择的文件
	//构造文件,同时增加异常处理
	CFile cFile;
	CFileException e;

	if (FALSE == cFile.Open(strPathName, CFile::modeRead,&e))
	{
		CString strException;
		strException.Format(_T("This file could not be opened\n\t error code: %d\n"), e.m_cause);
		MessageBox(strException, _T("kiki Tips:"), MB_OK | MB_ICONERROR);
		return;
	}
	//添加一个显示内容的编辑框 属性打开多行和垂直滚动显示
	//读取打开的文件内容
	DWORD dwCount, dwFilelenth = (DWORD)cFile.GetLength();
	char* szBuffer = new char[dwFilelenth + 1];
	ZeroMemory(szBuffer, dwFilelenth + 1);
	CString strContent;
	while (dwCount = cFile.Read(szBuffer, dwFilelenth))
	{
		//拼接读取数据
		strContent += szBuffer;
	}
	//字节转换
	int len = WideCharToMultiByte(CP_UTF8, 0, strContent, strContent.GetLength(), NULL, NULL, NULL, NULL);
	char *pMulticharBuf = new char[len + 1];
	ZeroMemory(pMulticharBuf, sizeof(char)*len);
	WideCharToMultiByte(CP_UTF8, 0, strContent,-1, pMulticharBuf, len, NULL, NULL);

	SetDlgItemText(IDC_EDIT2, strContent);
	cFile.Close();
	delete[] szBuffer;
	szBuffer = nullptr;
}

OnBnClickedSaveAs()函数实现:

/****************************************************************
*函数名称: save as 对话框
*功    能: 另存文本文件
*作    者:kiki
*日    期:2019/5/7
****************************************************************/

void CDay506Dlg::OnBnClickedSaveAs()
{
	// TODO:  在此添加控件通知处理程序代码
	//save as dialog
	CFileDialog fdlg(FALSE, NULL, _T("*.txt"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
		, _T("文本文件(*.txt)|*.txt|C++ source file(*.h; *.c; *.cpp)|*.h; *.c; *.cpp | 视频文件(*.avi) | *.avi | 所有文件(*.*) | *.* || "));
	if (IDCANCEL == fdlg.DoModal())
	{
		return;
	}
	CString strPathName = fdlg.GetPathName();
	//文件指针和异常
	CFile cFile;
	CFileException e;
	//链接缓冲
	CString strContent;
	//要写入字符串的长度
	//GetDlgItemText(IDC_EDIT2, strContent);
	GetDlgItem(IDC_EDIT2)->GetWindowText(strContent);
	DWORD dwFilelenth = (DWORD)strContent.GetLength();
	if (IDOK == cFile.Open(strPathName, CFile::modeCreate | CFile::modeReadWrite, &e))
	{
		int len = WideCharToMultiByte(CP_ACP, 0, strContent, strContent.GetLength(), NULL, NULL, NULL, NULL);
		char *pMulticharBuf = new char[len+1];
		ZeroMemory(pMulticharBuf, sizeof(char)*len);
		WideCharToMultiByte(CP_ACP, 0, strContent, strContent.GetLength(), pMulticharBuf, len, NULL, NULL);
		pMulticharBuf[len + 1] = '\0';
		cFile.Write(pMulticharBuf, len);
		cFile.Flush();
	}
	cFile.Close();
}

OnBnClickedNewFile()函数实现:

/****************************************************************
*函数名称: New File对话框
*功    能: 新建文本文件
*作    者:kiki
*日    期:2019/5/7
****************************************************************/

void CDay506Dlg::OnBnClickedNewFile()
{
	// TODO:  在此添加控件通知处理程序代码
	CString strException;
	strException.Format(_T("A new file will be created\n"));
	MessageBox(strException, _T("kiki Tips:"), MB_OK);
	SetDlgItemText(IDC_EDIT1, NULL);
	SetDlgItemText(IDC_EDIT2, NULL);
	strException.Format(_T("The new file was created successfully.\n"));
	MessageBox(strException, _T("kiki Tips:"), MB_OK);
}

打开//打开
在这里插入图片描述//save as

在这里插入图片描述//新建

基本功能就这,以后有时间了再丰富一下

  • 9
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值