【48】MFC入门到精通——MFC 文件读写总结 CFile、CStdioFile、CFileDialog

文章目录

  • 1 打开文件
    • 1.2 打开文件模式总结
  • 2 常用函数
    • 2.1 写文件
    • 2.2 读文件
    • 2.3 获取文件长度
  • 3. 文件打开读写实力
    • 3.1 写文件 覆盖写
    • 3.2 文尾追加写
    • 3.3 换行写
  • 4 文件对话框 CFileDialog
    • 4.2 文件对话框实例
  • 5 CStdioFile 类 读写CSting

MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘输入输出功能。通过他的派生类可以间接的支持文本、文件、内存文件等。

1 打开文件

通过对CFile类的初始化,即可完成文件的打开

//两个参数表示 文件名和打开方式
CFile(LPCTSTR lpszFileName, UINT nOpenFlags);

1.2 打开文件模式总结

CFile打开文件模式总结

在这里插入图片描述

2 常用函数

2.1 写文件

写文件时,需调用类的Write函数

void CFile::Write(const void* lpBuf, UINT nCount);
  • 参数lpBuf:写入数据的缓冲区

  • 参数nCount:写入数据的字符数

2.2 读文件

读文件时,调用类的Read函数

UINT CFile::Read(void* lpBuf, UINT nCount);
  • 参数lpBuf:接收读取数据的缓冲区

  • 参数nCount:要读取数据的字符数

  • 返回值:返回读取到缓冲区的字节数

在文件操作完毕后需要调用Close函数来关闭文件,如果在销毁对象之前尚未关闭文件,析构函数将为您关闭该文件。如果使用new在堆上分配对象,则必须在关闭 file.setsto 后将其删除。

2.3 获取文件长度

我们可以使用CFile类的GetLength函数来获取文件的长度

virtual ULONGLONG CFile::GetLength() const;

该函数可以返回我们打开的文件长度

3. 文件打开读写实力

3.1 写文件 覆盖写

文件流类CFile—数据写入文件

实例化一个对象对象使用open()函数打开文件,参数为文件路径和打开类型数据写入文件使用Write()关闭文件流Close()
void CMFCApplication1Dlg::OnBnClickedButton7()
{// TODO: 在此添加控件通知处理程序代码CString sname = _T("zhangsan");CString FileName = _T("D:\\Projects\\Programming_test\\test.txt");CFile fout;fout.Open(FileName, CFile::modeCreate + CFile::modeWrite); //直接构建创建一个新文件。如果该文件已经存在,则文件内容自动被清零。int len = sname.GetLength();fout.Write(sname, len * 2);//CString每个字符占2个字节,所以存储长度乘以2fout.Close();
}

在这里插入图片描述

3.2 文尾追加写

但上面面的写法存在问题,
问题:每录入一次信息,前面的数据就会被删除,如何解决数据被删除覆盖?
问题根源:因为每一次打开文件,文件写指针都是在文件的开头,所以数据会被删除覆盖。

(1)增加打开模式 表示追加

CFile::modeNoTruncate

该值一般modeCreate组合使用。如果创建的文件已经存在,那么它不会被清零。因而该文件能可靠的打开,或者新建一个文件或者打开一个现存文件。这对于打开一个可能存在可能不存在的设置文件十分有用。该选项通用可用于CStdioFile。

(2)文尾定位指针

CFile::SeekToEnd()

把文件指针定位至尾部

fout.SeekToEnd();

CFile::modeNoTruncate 和 CFile::SeekToEnd() 配合使用才能追加写。

void CMFCApplication1Dlg::OnBnClickedButton7()
{// TODO: 在此添加控件通知处理程序代码CString sname = _T("zhangsan");CString FileName = _T("D:\\Projects\\Programming_test\\test.txt");CFile fout;fout.Open(FileName, CFile::modeCreate + CFile::modeWrite+ CFile::modeNoTruncate);//新建或者打开一个现存文件,追加写int len = sname.GetLength();//CFile::modeNoTruncate,表示追加// .SeekToEnd();表示在文件末尾插入。fout.SeekToEnd(); fout.Write(sname, len * 2);//加1代表多一个空格来间隔数据fout.Close();
}

在这里插入图片描述

3.3 换行写

fout.Write("\n",1);

完整的输入数据的代码

void CMFCApplication1Dlg::OnBnClickedButton7()
{// TODO: 在此添加控件通知处理程序代码CString sname = _T("zhangsan");CString FileName = _T("D:\\Projects\\Programming_test\\test.txt");CFile fout;fout.Open(FileName, CFile::modeCreate + CFile::modeWrite+ CFile::modeNoTruncate);//新建或者打开一个现存文件,追加写int len = sname.GetLength();//CFile::modeNoTruncate,表示追加// .SeekToEnd();表示在文件末尾插入。fout.SeekToEnd(); fout.Write(sname, len * 2);//加1代表多一个空格来间隔数据fout.Write(_T("\r\n"),1);//数据换行fout.Close();
}

可以换行写了,但有个问题,每个字符之间有个空格
在这里插入图片描述

上写入的是CString字符,我们看一下

将写入的字符换位 cahr * ,正常了.

void CMFCApplication1Dlg::OnBnClickedButton7()
{// TODO: 在此添加控件通知处理程序代码char sname[] = "zhangsan";CString FileName = _T("D:\\Projects\\Programming_test\\test.txt");CFile fout;fout.Open(FileName, CFile::modeCreate + CFile::modeWrite+ CFile::modeNoTruncate);//新建或者打开一个现存文件,追加写//CFile::modeNoTruncate,表示追加// .SeekToEnd();表示在文件末尾插入。fout.SeekToEnd(); fout.Write(sname, strlen(sname));//加1代表多一个空格来间隔数据fout.Write(_T("\r\n"), 1);//数据换行fout.Close();
}

在这里插入图片描述

4 文件对话框 CFileDialog

MFC 文件对话框 CFileDialog (打开文件 和 保存文件 对话框)

有时候我们希望能动态更改文件的读写位置,那么就可以使用CFileDialog类来实现这一功能。

CFileDialog类封装了Windows常用的文件对话框。常用的文件对话框提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能。

4.2 文件对话框实例

根据前面所讲内容,给大家做个文件对话框实例。

1.创建一个基于对话框的MFC应用程序工程,名称设为“MFCTest”。

2.修改主对话框IDD_MFCTEST_DIALOG的模板,删除自动生成的“TODO: Place dialog controls here.”静态文本框,

添加两个编辑框,ID分别为IDC_OPEN_EDIT和IDC_SAVE_EDIT,
再添加两个按钮,ID分别设为IDC_OPEN_BUTTON和IDC_SAVE_BUTTON,
Caption(描述文字)分别设为“打开”和“保存”。

按钮IDC_OPEN_BUTTON用于显示打开文件对话框,编辑框IDC_OPEN_EDIT显示在打开文件对话框中选择的文件路径。
按钮IDC_SAVE_BUTTON用于显示保存文件对话框,编辑框IDC_SAVE_BUTTON显示在保存文件对话框中选择的文件路径。

3.分别为按钮IDC_OPEN_BUTTON和IDC_SAVE_BUTTON添加点击消息的消息处理函数
双击 打开 和 保存 按钮 进入到CMFCTestDlg::OnBnClickedOpenButton()和CMFCTestDlg::OnBnClickedSaveButton()函数

4.修改两个消息处理函数如下:

void CMFCTestDlg::OnBnClickedOpenButton()
{// TODO: 在此添加控件通知处理程序代码// 设置过滤器TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");// 构造打开文件对话框 (TRUE创建打开文件对话框)CFileDialog fileDlg(TRUE,_T("txt"),NULL,0,szFilter,this);CString strFilePath;// 显示打开文件对话框if (IDOK == fileDlg.DoModal()){// 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径显示到编辑框里strFilePath = fileDlg.GetPathName();SetDlgItemText(IDC_OPEN_EDIT,strFilePath);//读取并显示文件内容CFile file(strFilePath, CFile::modeRead);char* pBuf;DWORD dwFileLen = file.GetLength();pBuf = new char[dwFileLen + 1];pBuf[dwFileLen] = 0;file.Read(pBuf, dwFileLen);USES_CONVERSION;CString strBuf = A2W(pBuf);MessageBox(strBuf);file.Close();}
}void CMFCTestDlg::OnBnClickedSaveButton()
{// TODO: 在此添加控件通知处理程序代码// 设置过滤器TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|Word文件(*.doc)|*.doc|所有文件(*.*)|*.*||");// 构造保存文件对话框(FALSE创建保存文件对话框。)CFileDialog fileDlg(FALSE, _T("doc"),_T("my"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, szFilter, this);CString strFilePath;// 显示保存文件对话框if (IDOK == fileDlg.DoModal()){// 如果点击了文件对话框上的“保存”按钮,则将选择的文件路径显示到编辑框里strFilePath = fileDlg.GetPathName();SetDlgItemText(IDC_SAVE_EDIT, strFilePath);//简单的写入文件CFile file;file.Open(strFilePath, CFile::modeCreate + CFile::modeWrite + CFile::modeNoTruncate);//新建或者打开一个现存文件,追加写file.Write("Tom and Jerry", strlen("Tom and Jerry"));file.Close();}
}

上面显示编辑框内容时,使用了Windows API函数SetDlgItemText,当然也可以先给编辑框关联变量,然后再使用在创建对话框类和添加控件变量中介绍的
CDialogEx::UpdateData()函数,但是比较习惯使用SetDlgItemText函数,感觉比较灵活。

5.运行此程序
在这里插入图片描述

在结果对话框上点“保存”按钮,显示保存文件对话框如下:
在这里插入图片描述

在这里插入图片描述

在打开文件
在这里插入图片描述

在这里插入图片描述

到此,文件对话框就讲完了,是不是依然很简单?如果忘记了文件对话框类构造函数的参数意义,可以回到来看看或者在MSDN上查阅。

MFC 文件对话框-打开文件-保存文件 代码下载

5 CStdioFile 类 读写CSting

CStdioFile继承自CFile,它可以建立一个CStdioFile 对象,更好的读写CSting;

CStdioFile定义在"afx.h"头文件中,因此在使用该类之前需要先引入该头文件。

CString CMFCApplication1Dlg::ReadCString()
{CStdioFile file;//CStdioFile继承自CFile,它可以建立一个CStdioFile 对象CString FileName = _T("D:\\Projects\\Programming_test\\test.txt");if (!file.Open(FileName, CFile::modeRead))//新建或者打开一个现存文件,追加写{return 0;}CString  strLine = _T("");CString str;while (file.ReadString(strLine)){//输出处理结果GetDlgItemText(IDC_STATIC_LOG, str);//获取已显示的文本str = str + _T("\r\n") + strLine;//加换行、加新的文本,ICR_Process_result即新的文件内容SetDlgItemText(IDC_STATIC_LOG, str);}file.Close();return str;
}int CMFCApplication1Dlg::WriteCStr()
{CStdioFile file;//CStdioFile继承自CFile,它可以建立一个CStdioFile 对象CString FileName = _T("D:\\Projects\\Programming_test\\test.txt");if (!file.Open(FileName, CFile::modeCreate + CFile::modeWrite + CFile::modeNoTruncate))//新建或者打开一个现存文件,追加写{return 0;}CString s1 = _T("#sIpAddress\n");CString s2 = _T("192.168.1.64\n");CString s3 = _T("#sUserID\n");CString s4 = _T("admin\n");CString s5 = _T("#sPassword\n");CString s6 = _T("abcd1234\n");file.WriteString(s1);file.WriteString(s2);file.WriteString(s3);file.WriteString(s4);file.WriteString(s5);file.WriteString(s6);file.Close();return 0;
}void CMFCApplication1Dlg::OnBnClickedButtonReadcstr()
{// TODO: 在此添加控件通知处理程序代码ReadCString();
}void CMFCApplication1Dlg::OnBnClickedButtonWritecstr()
{// TODO: 在此添加控件通知处理程序代码WriteCStr();
}

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/89767.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode 124. 二叉树中的最大路径和

递归/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode…

MTSC2025参会感悟:手工测试用例的智能化生成

目录 一、测试用例生成的时代困境与 AI 机遇 1.1 传统手工测试用例的固有痛点 1.2 AI 时代的测试新挑战 1.3 智能化转型的机遇窗口 二、智能用例生成的核心特性与产品功能 2.1 核心特性解析 2.2 四大核心产品功能 功能一:基于 PRD 理解的一键生成用例 功能二…

后台管理系统登录模块(双token的实现思路)

最近在写后台管理,这里分享一下我的登录模块的实现,我是使用reacttypescript实现的,主要是登录的逻辑和双token的处理方式,请求接口的二次封装aixos1.首先我们需要渲染登录界面的窗口,这个很简单就不详细讲解了&#x…

第十四讲 | AVL树实现

AVL树实现一、AVL的概念二、AVL树的实现1、AVL树的结构2、AVL树的插入(1)、AVL树插入一个值的大概过程(2)、平衡因子更新更新原则更新停止条件插入结点及更新平衡因子的代码实现3、旋转(1)、旋转的原则&…

《P3398 仓鼠找 sugar》

题目描述小仓鼠的和他的基(mei)友(zi)sugar 住在地下洞穴中,每个节点的编号为 1∼n。地下洞穴是一个树形结构。这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而…

锤子助手插件功能六:启用拦截消息撤回

锤子助手插件功能六:启用拦截消息撤回锤子助手插件功能六:启用拦截消息撤回🛡️ 插件简介 拦截撤回消息,信息不再消失🔧 功能说明⚠️ 使用风险与注意事项🎯 适合人群❤️ 结语锤子助手插件功能六&#xf…

深度解析:基于EasyX的C++黑白棋AI实现 | 算法核心+图形化实战

摘要 本文详解C黑白棋AI实现,使用EasyX图形库打造完整人机对战系统。涵盖: 递归搜索算法(动态规划优化) 棋盘状态评估函数设计 图形界面与音效集成 胜负判定与用户交互 附完整可运行代码资源文件,提供AI难度调节方案…

树同构(Tree Isomorphism)

树同构(Tree Isomorphism)​​ 是图论中的一个经典问题,主要研究两棵树在结构上是否“相同”或“等价”,即是否存在一种节点的一一对应关系,使得两棵树的结构完全一致(不考虑节点的具体标签或位置&#xff…

分享如何在保证画质的前提下缩小视频体积实用方案

大文件在通过互联网分享或上传时会遇到很多限制,比如电子邮件附件大小限制、社交媒体平台的文件大小要求等。压缩后的视频文件更小,更容易上传到网络、发送给他人或共享在社交平台上。它是一款无需安装的视频压缩工具,解压后直接运行&#xf…

SpringBoot 统一功能处理(拦截器、@ControllerAdvice、Spring AOP)

文章目录拦截器快速入门拦截器详解拦截路径拦截器执行流程全局控制器增强机制(ControllerAdvice)统一数据返回格式(ControllerAdvice ResponseBodyAdvice)​​全局异常处理机制​​(ControllerAdvice ExceptionHandler)全局数据…

建筑墙壁损伤缺陷分割数据集labelme格式7820张20类别

数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件)图片数量(jpg文件个数):7820标注数量(json文件个数):7820标注类别数:20标注类别名称:["Graffiti","Bearing","Wets…

图书管理软件iOS(iPhone)

图书管理软件iOS(iPhone)开发进度表2025/07/19图书管理软件开发开始一:图书管理软件开发iOS(iPhone)

MySQL配置性能优化

技术文章大纲:MySQL配置性能优化赛 引言 介绍MySQL性能优化的重要性,特别是在高并发、大数据场景下的挑战。概述MySQL配置优化的核心方向(如内存、查询、索引等)。引出比赛目标:通过配置调整提升MySQL性能指标&#xf…

uniapp微信小程序 实现swiper与按钮实现上下联动

1. 需求:页面顶部展示n个小图标。当选中某个图标时,下方视图会相应切换;反之,当滑动下方视图时,顶部选中的图标也会同步更新。 2. 思路: 上方scroll-view 区域渲染图标,并且可左右滑动&#xff…

44.sentinel授权规则

授权规则是对请求者的身份做一个判断,有没有权限来访问。 需求:一般网关负责请求的转发到微服务,可以做身份判断。但是如果具体某个微服务的访问地址直接透露给了外部,不是经过网关访问过来的。那这种就没有经过网关也就无法进行身份判断了。这时候就需要sentinel的授权规…

[硬件电路-55]:绝缘栅双极型晶体管(IGBT)的原理与应用

一、IGBT的原理:MOSFET与BJT的复合创新IGBT(Insulated Gate Bipolar Transistor)是一种复合全控型电压驱动式功率半导体器件,其核心设计融合了MOSFET(金属氧化物半导体场效应晶体管)的高输入阻抗&#xff0…

取消office word中的段落箭头标记

对于一个习惯用WPS的人来说,office word中的段落箭头让人非常难受,所以想要取消该功能点击文件-更多-选项然后在显示界面,找到段落标记,取消勾选即可最终效果

Win11 上使用 Qume 搭建银河麒麟V10 arm版虚拟机

安装全程需要下载3个文件,可在提前根据文章1.1、2.1、2.2网址下载。 1 QEMU软件简介与安装流程 QEMU(Quick Emulator)是一个开源软件,可以模拟不同的计算机硬件行为(如模拟arm架构),并可以创建…

[Linux]进程 / PID

一、认识进程 --- PCB写一个死循环程序执行起来,观察进程ps ajx 显示所有进程用分号可以在命令行的一行中执行多条指令,也可以用 && :ps ajx | head -1 && ps ajx | grep proc终止掉进程后再查看:所以 ./p…

【人工智能99问】门控循环但单元(GRU)的结构和原理是什么?(13/99)

文章目录GRU(Gated Recurrent Unit)的结构与原理一、GRU的结构与原理1. 核心组件2. 计算原理(数学公式)二、GRU的使用场景三、GRU的优缺点优点:缺点:四、GRU的训练技巧五、GRU的关键改进六、GRU的相关知识与…