VC++文件操作详解及示例(CFileDialog、CStdioFile)

本文详细介绍了VC++中进行文件操作的两种常见方法:使用CFileDialog进行文件打开和保存对话框操作,以及利用CStdioFile进行文本文件的读写。CFileDialog的重要参数如lpszFilter用于文件类型筛选,CStdioFile则适合文本文件的处理,提供了Open、ReadString和WriteString等关键函数。

文件操作是windows编程最常用的,这涉及到文件打开和保存对话框、文件读取、文件保存等,下面分别对这一块的相关类和函数作一个详细的解读和示例。

1、文件打开和保存对话框CFileDialog

VC++的MFC类CFileDialog类,封装了Windows常用的文件对话框,提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能,其函数原型如下:

CFileDialog::CFileDialog
(
BOOL bOpenFileDialog,    //TRUE则显示打开文件对话框,FALSE则显示保存文件对话框    
LPCTSTR lpszDefExt = NULL,    //默认打开的文件扩展名
LPCTSTR lpszFileName = NULL,//指定默认的文件名
DWORD dwFlags = OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,//打开的风格,如隐藏文件是否可见,另外还有一个很重要的值是OFN_ALLOWMULTISELECT,可以用来开启同时多选几个文件
LPCTSTR lpszFilter = NULL,    //打开的文件扩展名列表,可以为空,也可以是多个
CWnd* pParentWnd = NULL    //父窗口指针
);

以上参数中最重要的是lpszFilter 参数,用来过滤和筛选文件各类。文件类型名称说明和扩展名之间用 | 分隔,同种类型的文件扩展名间用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 结束。如下面过滤内容变分成了三类:All DocFiles、Word Files、Excel Files。

"All DocFiles |*.doc;*.docx;*.ppt;*.pptx;*.xls;*.xlsx|Word Files|*.doc;*.docx|Excel Files|*.xls;*.xlsx||"

另外CFileDialog最主要要的几个成员函数有:

GetPathName( );// 得到完整的路径名、文件名和扩展名,如:D:\my doc\c++学习.docx

GetFileName( );// 得到完整文件名,包括扩展名,如:c++学习.docx

GetExtName( ) ;// 只得到文件扩展名,如:docx

GetFileTitle ( );// 只得到文件名,不包括目录名和扩展名,如:c++学习

GetStartPosition( ) ;// 如果用了OFN_ALLOWMULTISELECT选项,则可通过此函数获取第一个文件位置

GetNextPathName();//如果用了OFN_ALLOWMULTISELECT选项,取得当前位置文件名,并将位置下移

//下在是打开文件对话框示例
	CFileDialog open_dlg(true, "", NULL, NULL, "All DocFile |*.doc;*.docx;*.ppt;*.pptx;*.xls;*.xlsx|Word Files|*.doc;*.docx|Excel Files|*.xls;*.xlsx||");
	if (open_dlg.DoModal() != IDOK)
		return;

	CString strOpenFileName = open_dlg.GetPathName();

	//下面是保存文件对话框示例
	CFileDialog save_dlg(false, "*.docx|*.docx||", NULL, NULL, "*.xlsx|*.xlsx|*.xls|*.xls|*.doc|*.doc|*.docx|*.docx|*.ppt|*.ppt|*.pptx|*.pptx||");
	if (save_dlg.DoModal() != IDOK)
		return;

	CString strSaveFileName = save_dlg.GetPathName();
        //下面是打开多个文件对话框示例
	CFileDialog open_dlg(true, "", NULL, OFN_ALLOWMULTISELECT, "All DocFile |*.doc;*.docx;*.ppt;*.pptx;*.xls;*.xlsx|Word Files|*.doc;*.docx|Excel Files|*.xls;*.xlsx||");
	if (open_dlg.DoModal() != IDOK)
		return;

	POSITION pos = open_dlg.GetStartPosition();
	while (pos != NULL)
	{
		CString strCurFileName = open_dlg.GetNextPathName(pos);
		AfxMessageBox(strCurFileName);
	}

2、CStdioFile文本文件读写

CStdioFile继承自CFile,一个CStdioFile对象代表一个用运行时函数fopen 打开的C 运行时流式文件,默认以文本方式打开,所以很适合用于读写文本文件。按行读取一行文本到缓冲区,遇到“0x0D,0x0A”时停止读取,并且去掉硬回车“0x0D”,保留换行符“0x0A”,在字符串末尾添加“\0”(0x00)。

对于初学者只要掌握如下几个成员函数即可:

1)CStdioFile::Open(LPCTSTR lpszFileName,UINT nOpenFlags,CFileException* pError = NULL);

lpszFileName:是打开的文件名,是绝对路径或者和exe在同一根目录下的相对路径;

nOpenFlags:指的是CFile类中所描述的打开文件的方式。可以按位指定多个选项通过使用或(|)运算符;

2)CStdioFile::ReadString(LPTSTR lpsz, UINT nMax);

如果文件有多行,则当文件没有读完时,返回TRUE,读到文件尾,返回FALSE,本人一般用下面的ReadString(CString &rString)函数。

3)CStdioFile::ReadString(CString &rString);

此函数按行读取打开的文件内容,rString返回读取的内容,如果还有内容未读取则返回true,已经读取完成则返回false.

4)CStdioFile::WriteString( LPCTSTR lpsz );

此函数按行写文件,并将文件指针指向文件尾。

下面是文件读写的两个函数示例代码:

//****************************************************************************************//
//函数 ReadTxtFile
//主要功能: 
//参数列表: 
//         1、CString strFileName:要读取的文件名
//         2、CString &strContent:返回读取的文件内容
//返回值: 成功为true,失败为false
//备注: 
//****************************************************************************************//
bool ReadTxtFile(CString strFileName, CString &strContent)
{
	CStdioFile f;
	if (f.Open(strFileName, CFile::modeRead) == false)
		return false;
	CString strLine;
	while (f.ReadString(strLine))
		strContent += strLine;

	f.Close();
	return true;
}

//****************************************************************************************//
//函数 SaveTxtFile
//主要功能: 
//参数列表: 
//         1、CString strFileName:要保存的文件名
//		   2、CString &strContent:要写的文件内容
//返回值: 成功为true,失败为false
//备注: 
//****************************************************************************************//
bool SaveTxtFile(CString strFileName, CString &strContent)
{
	CStdioFile f;
	if (f.Open(strFileName, CFile::modeCreate | CFile::modeNoTruncate) == false)//modeNoTruncate表示如果文件已经存在则追加在后面
		return false;
	
	f.WriteString(strContent);

	f.Close();
	return true;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值