1、写文件
在 MFC 库中,CFile::Write
方法用于向文件中写入数据。这个方法直接将数据从内存写入到打开的文件中。
方法原型
void CFile::Write(const void* lpBuf, UINT nCount);
- lpBuf: 指向要写入文件的数据缓冲区的指针。
- nCount: 指定要写入的字节数。
使用示例
下面是一个使用 CFile::Write
方法的示例,展示如何向文件中写入字符串数据:
#include <afx.h>
#include <cstring>
int main() {
CFile file;
CFileException e;
// 尝试以创建和写入模式打开文件
if (!file.Open(_T("example.txt"), CFile::modeCreate | CFile::modeWrite, &e)) {
std::cerr << "Cannot open file, error = " << e.m_cause << std::endl;
return 1;
}
// 要写入的文本
const char* text = "Hello, MFC World!";
UINT textLength = static_cast<UINT>(strlen(text));
// 写入文本数据
file.Write(text, textLength);
// 关闭文件
file.Close();
return 0;
}
在这个示例中,我们首先打开一个文件用于写入。然后定义一个字符串 text
,并使用 Write
方法将其内容写入文件。注意,我们需要提供数据的长度,这里使用 strlen
函数来获取字符串的长度(不包括终止符 ‘\0’)。
注意事项
- 确保在调用
Write
方法之前文件已经成功打开。 Write
方法不会自动添加字符串终止符 ‘\0’,如果写入字符串数据,需要确保正确处理字符串的结束。- 写入操作可能会引发
CFileException
,因此最好在调用Write
时进行异常处理。 - 考虑到数据类型和编码,当写入非文本数据(如二进制数据)时,需要确保正确理解和使用数据缓冲区和长度。
通过 CFile::Write
方法,可以方便地将内存中的数据写入到文件中,这对于文件数据管理是非常有用的。
2、读文件
在 MFC 库中,CFile::Read
方法用于从打开的文件中读取数据。这个方法将文件中的数据读入到指定的内存缓冲区中。
方法原型
UINT CFile::Read(void* lpBuf, UINT nCount);
- lpBuf: 指向接收从文件读取的数据的缓冲区的指针。
- nCount: 指定要读取的最大字节数。
返回值
Read
方法返回实际读取的字节数。如果到达文件末尾,则返回的字节数可能少于请求的字节数,或者为零。
使用示例
下面是一个使用 CFile::Read
方法的示例,展示如何从文件中读取数据:
#include <afx.h>
#include <iostream>
int main() {
CFile file;
CFileException e;
// 尝试以只读模式打开文件
if (!file.Open(_T("example.txt"), CFile::modeRead, &e)) {
std::cerr << "Cannot open file, error = " << e.m_cause << std::endl;
return 1;
}
// 准备缓冲区接收数据
char buffer[1024];
UINT nBytesRead = file.Read(buffer, sizeof(buffer) - 1); // 保留一个位置放置字符串终止符
// 添加字符串终止符
buffer[nBytesRead] = '\0';
// 输出读取的内容
std::cout << "Data read from file: " << buffer << std::endl;
// 关闭文件
file.Close();
return 0;
}
在这个示例中,我们首先以只读模式打开一个文件。然后定义一个字符数组 buffer
作为数据接收缓冲区,并调用 Read
方法从文件中读取数据。读取的数据量由 Read
方法返回,并将其用于设置字符串的终止符,最后输出读取的内容。
注意事项
- 确保在调用
Read
方法之前文件已经成功打开,并且是以适当的模式(如只读或读写模式)打开。 Read
方法不会自动添加字符串终止符 ‘\0’,如果读取字符串数据,需要手动处理字符串的结束。- 读取操作可能会引发
CFileException
,因此最好在调用Read
时进行异常处理。 - 考虑到数据类型和编码,当读取非文本数据(如二进制数据)时,需要确保正确理解和使用数据缓冲区和长度。
通过 CFile::Read
方法,可以方便地从文件中读取数据,这对于文件数据的处理和分析非常有用。
3、对话框选择文件
在 MFC (Microsoft Foundation Classes) 库中,CFileDialog
是一个用于显示标准 Windows 文件打开或保存对话框的类。这个类提供了一个方便的方式来让用户选择文件。
主要特性
- 文件选择: 允许用户浏览文件系统选择文件或保存文件。
- 过滤器: 可以设置文件类型过滤器,以便只显示对话框中的特定类型文件。
- 多选: 支持选择多个文件。
- 自定义模板: 允许开发者自定义对话框的外观和功能。
构造函数
CFileDialog
的构造函数允许指定对话框是用于打开文件还是保存文件:
CFileDialog(BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL,
DWORD dwSize = 0,
BOOL bVistaStyle = TRUE);
- bOpenFileDialog: 如果为
TRUE
,显示“打开”对话框;如果为FALSE
,显示“保存”对话框。 - lpszDefExt: 默认文件扩展名。
- lpszFileName: 初始文件名。
- dwFlags: 控制对话框行为的标志。
- lpszFilter: 文件类型过滤器,格式为
"描述\0*.ext\0描述\0*.ext\0"
。 - pParentWnd: 对话框的父窗口。
- dwSize: 结构的大小。
- bVistaStyle: 是否使用 Vista 风格的对话框。
使用示例
下面是一个使用 CFileDialog
的示例,展示如何创建和显示一个文件打开对话框:
#include <afxwin.h>
int main() {
// 创建应用程序对象
CWinApp theApp;
// 初始化应用程序
theApp.InitApplication();
// 创建并显示文件打开对话框
CFileDialog fileDlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, _T("All Files (*.*)|*.*||"));
if (fileDlg.DoModal() == IDOK) {
CString filePath = fileDlg.GetPathName(); // 获取选中的文件路径
AfxMessageBox(filePath); // 显示文件路径
}
return 0;
}
注意事项
- 在使用
CFileDialog
时,确保正确设置过滤器字符串,避免格式错误。 - 根据需要设置对话框的标志,例如
OFN_FILEMUSTEXIST
确保用户不能选择不存在的文件。 - 使用
DoModal
方法显示对话框,并根据返回值判断用户操作(如IDOK
表示用户点击了“确定”)。 - 使用
GetPathName
、GetFileName
等方法获取用户选择的文件信息。
CFileDialog
是一个非常有用的类,通过它可以很方便地集成文件选择功能到 MFC 应用程序中。
4、实际操作
void CFileProjDlg::OnBnClickedButtonWrite()
{
//MFC写文件
CFile cfile("4.txt",CFile::modeCreate | CFile::modeWrite);
char szBuf[1024] = "MFC操作文件";
cfile.Write(szBuf, strlen(szBuf));
cfile.Close();
}
void CFileProjDlg::OnBnClickedButtonRead()
{
//MFC读文件
//CFile cfile("4.txt", CFile::modeRead);
//char szBuf[1024] = { 0 };
//DWORD dwFileLen;
//dwFileLen = cfile.GetLength();
//cfile.Read(szBuf, dwFileLen);
//cfile.Close();
//MessageBox(szBuf);
//MFC读文件 高阶 打开文件管理器,选择对应文件
CFileDialog fileDlg(TRUE);
fileDlg.m_ofn.lpstrTitle = "Test";
fileDlg.m_ofn.lpstrFilter = "Text Filles(*.txt)\0*.txt\0ALL Files(*.*)\0";
if (IDOK == fileDlg.DoModal())
{
CFile cfile(fileDlg.GetFileName(), CFile::modeRead);
char szBuf[1024] = { 0 };
DWORD dwFileLen;
dwFileLen = cfile.GetLength();
cfile.Read(szBuf, dwFileLen);
cfile.Close();
MessageBox(szBuf);
}
}