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

被折叠的 条评论
为什么被折叠?



