MFC文件操作

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 表示用户点击了“确定”)。
  • 使用 GetPathNameGetFileName 等方法获取用户选择的文件信息。

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);
	}
}

在这里插入图片描述

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值