MFC文件操作

news2024/11/25 5:34:10

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

打开文件

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

CFile类的其中一个构造函数:

CFile(LPCTSTR lpszFileName, UINT nOpenFlags);
  • 参数lpszFileName

    表示文件名

  • 参数nOpenFlage

    表示打开方式

CFile打开文件模式总结,里面有几种模式可能是SDK中的高级模式,使用频率不高,不过应该可以在某种场合满足用户的一些高级要求。因为我没有用到过,所以可能翻译的理解上有偏差。如果以后有幸能理解透彻,再来斟酌修改吧。

打开模式含义

 CFile::modeCreate

直接构建创建一个新文件。如果该文件已经存在,则文件内容自动被清零。

CFile::modeNoTruncate

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

CFile::modeRead

以只读方式打开文件

CFile::modeReadWrite  

以可读可写方式打开文件。

CFile::modeWrite

以只写方式打开文件。

CFile::modeNoInherit

阻止文件被子进程继承。

CFile::shareDenyNone

以不拒绝其他进程对文件的读写方式打开。如果文件已经被其他进程以compatibility模式打开,则文件创建失败。

CFile::shareDenyRead

以拒绝其他进程对文件读的方式打开。如果文件已经被其他进程以compatibility模式或读打开,则文件创建失败。

CFile::shareDenyWrite

以拒绝其他进程对文件写的方式打开。如果文件已经被其他进程以compatibility模式或写打开,则文件创建失败。

CFile::shareExclusive

以exclusive方式打开,拒绝其他进程对文件的读写。如果该文件已经被不管任何进程以任何方式打开都构建失败。

CFile::shareCompat

此标志在32位MFC中无效。该标志当使用CFile::Open时映射为CFile::shareExclusive。

CFile::typeText

以文本方式打开。

CFile::typeBinary   

以二进制方式打开(只在派生类中使用)。

CFile::osNoBuffer

系统打开文件不开系统缓存。可查看Platform SDK中CreateFile的FILE_FLAG_NO_BUFFERING。

CFile::osWriteThrough

通过任何快速缓存并直接写磁盘的标志。可查看Platform SDK中CreateFile的FILE_FLAG_WRITE_THROUGH。

CFile::osRandomAccess

随机访问文件方式。系统使用这种方式优化文件缓冲区。

CFile::osSequentialScan

从开头到结尾的顺序访问文件方式。系统使用这种方式来优化文件缓冲区。可查看Platform SDK中CreateFile的FILE_FLAG_SEQUENTIAL_SCAN。

写文件 

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

void CFile::Write(const void* lpBuf, UINT nCount);
  • 参数lpBuf

表示写入数据的缓冲区

  • 参数nCount

表示写入数据的字符数

读文件 

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

UINT CFile::Read(void* lpBuf, UINT nCount);
  • 参数lpBuf

表示接收读取数据的缓冲区

  • 参数nCount

表示要读取数据的字符数

  • 返回值

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

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

获取文件长度 

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

virtual ULONGLONG CFile::GetLength() const;

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

Example 

代码示例:

写文件时,使用CFile::modeCreate和CFile::modeWrite模式初始我们的CFile类

//mfc文件操作
void CMyFileCFileView::OnMFCWriteFile() {
	//MFC提供的文件操作时CFile类
	CFile file(L"4.txt", CFile::modeCreate | CFile::modeWrite);	//CFile提供的其中一个构造函数
	file.Write("Hello World", strlen("Hello World"));
	file.Close();
}

读文件,首先获得文件的大小,根据大小new一个字符缓冲区接收读取的文件内容。 

//读文件
void CMyFileCFileView::OnMFCReadFile() {
	CFile file(L"4.txt", CFile::modeRead);	//CFile提供的其中一个构造函数
	char* pBuf;
	//获取文件大小
	DWORD dwFileLen = file.GetLength();

	pBuf = new char[dwFileLen + 1];

	file.Read(pBuf, dwFileLen);
	pBuf[dwFileLen] = 0;
	file.Close();
	USES_CONVERSION;
	CString strBuf = A2W(pBuf);
	MessageBox(strBuf);
}

运行结果: 

 

CFileDialog 类

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

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

下面代码示例了一种简单的文件存盘和打开对话框功能。文件的读取和写入使用的是MFC的文件读写。

文件保存:

下面这段程序更改了对话框标题,并限定保存的文件类型为.txt文本类型,当用户点击对话框确定按钮后,程序会读取用户输入的文件名,并将其保存为.txt类型。最后向文本内写入"Tom and Jerry"

void CMyFileCFileView::OnFileDialog() {
	CFileDialog fileDlg(FALSE);
	fileDlg.m_ofn.lpstrTitle = L"提示";//改标题
	fileDlg.m_ofn.lpstrFilter = _T("Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0");
	fileDlg.m_ofn.lpstrDefExt = L"txt";

	if (IDOK == fileDlg.DoModal()) {
		CFile file(fileDlg.GetFileName(), CFile::modeCreate | CFile::modeWrite);
		USES_CONVERSION;
		char *szBuf = T2A(fileDlg.GetFileName());
		file.Write("Tom and Jerry", strlen("Tom and Jerry"));
		file.Close();
	}

}

文件读取: 

下面这段程序更改了对话框标题,并限定读取的文件类型为.txt文本类型,当用户点击对话框确定按钮后,程序会读取用户输入的文件名,并读取这个文件内容,之后通过消息框显示出来。

void CMyFileCFileView::OnFileDialogRead() {
	CFileDialog fileDlg(TRUE);
	fileDlg.m_ofn.lpstrTitle = L"提示";//改标题
	fileDlg.m_ofn.lpstrFilter = _T("Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0");
	if (IDOK == fileDlg.DoModal()) {
		CFile file(fileDlg.GetFileName(), 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();
	}

}

 

CFileDialog的构造函数

explicit 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

指定文件的筛选器。如果指定文件筛选器,则只有与筛选条件匹配的文件才会显示在“文件”列表中。

  • 参数pParentWnd

指定文件对话框的父窗口或所有者的窗口指针

  • 参数dwSize

结构的大小。此值取决于操作系统版本。默认大小 0 表示 MFC 代码将根据运行程序的操作系统版本确定要使用的正确对话框大小。

 

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

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

相关文章

【论文精读】A Survey on Deep Learning for Named Entity Recognition

A Survey on Deep Learning for Named Entity Recognition前言Abstract1. INTRODUCTION2. BACKGROUND2.1 What is NER?2.2 NER Resources: Datasets and Tools2.3 NER Evaluation Metrics2.3.1 Exact-Match Evaluation2.3.2 Relaxed-Match Evaluation2.4 Traditional Approach…

Docker学习教程

学前准备 👿 Linux 基础 👿 SpringBoot 基础 文章目录[toc]1. Docker 概述1.1 docker 为什么出现1.2 Docker 容器和虚拟机的不同1.3 Docker 能做什么2. Docker 安装2.1 Docker 的组成3. Docker 命令3-1 安装Nginx3-2 安装mysql3-3 安装java &#xff0c…

八、【React拓展】错误边界

理解 错误边界(Error boundary):用来捕获后代组件错误,渲染出备用页面 如果你的组件内写了包含子组件,一个子组件内部发生了错误就会导致整个页面挂掉(报错),限制这种错误影响其他组件(就是限制…

10-18-hive-元数据及其他方式与hive交互

10-hive-元数据及其他方式访问hive&#xff1a; 使用元数据服务的方式访问 Hive (类似将hive提供了一个服务端) 1&#xff09;在hive-site.xml 文件中添加如下配置信息 <!-- 指定存储元数据要连接的地址 --> <property> <name>hive.metastore.uris</nam…

简易的shell实现

这篇文章的内容主要是利用进程的创建&#xff0c;等待&#xff0c;终止&#xff0c;替换。这些知识来实现一个自己的简易shell。 文章目录1. 大致思路2. 基本实现3. 额外拓展3.1 让文件带上颜色3.2 内建命令3.3 添加环境变量1. 大致思路 我们用了这么长的shell&#xff0c;它…

DolphinDB 四大因子库合集

目前市场上常见两种类型的因子库&#xff1a;技术分析类和基本面类。 常用的技术分析因子库包括 TA-Lib、WorldQuant 的101 alpha、通达信的 mytt、国泰君安的191等。 基本面因子方面&#xff0c;美联储高级经济学家 Andrew Chen 及科隆大学教授 Tom Zimmermann 详细整理总结…

Hadoop原理与技术——Linus命令行基本操作

一、实验目的 Hadoop运行在Linux系统上&#xff0c;因此&#xff0c;需要学习实践一些常用的Linux命令。本实验旨在熟悉常用的Linux操作&#xff0c;为顺利开展后续其他实验奠定基础。 二、实验环境 Windows 10 VMware Workstation Pro虚拟机 Hadoop环境 Jdk1.8 三、实验内…

IP-Guard如何判断Windows客户端是否安装成功?

1.在电脑本地打开services.msc 服务页面&#xff0c;找有没有windows helper service服务&#xff0c;该服务的可执行文件的路径中的进程是winrdgv3.exe是客户端进程。 2.cmd输入netstat -an|find "823",从输出的内容上判断是否连接上服务器连&#xff1b; 客户端开放…

Linux基础知识与实操-篇八:定期任务执行与进程任务处理

文章目录例行工作安排单一工作安排循环执行的任务注意事项唤醒停机期间的任务进程任务处理任务管理job control后台执行进程管理进程的执行顺序系统资源查看特殊文件与进程最后例行工作安排 类似于定时任务、系统安排的任务提醒等 一般在任务中&#xff0c;有两个类型&#x…

MR小区搜索(六)cell reselection

微信同步更新欢迎关注同名modem协议笔记 小区选择和小区重选都是idle态行为&#xff0c;小区重选无非是为了让UE驻留在信号状况最好的小区上&#xff0c;以便之后在connected mode获得更好的体验&#xff0c;小区重选的目标小区也要满足S准则&#xff0c;下面就来具体看下小区…

19c pdb克隆单机到rac,日志出现:WARNING报警处理

打开pdb后&#xff0c;警告日志出现 Violations: Type: 2, Count: 1 *************************************************************** WARNING: Pluggable Database PDB3 with pdb id - 3 is altered with errors or warnings. Please look into PDB_PLUG_IN_VIOLATIONS vie…

运算符-12-多学一招原码反码补码,隐式和强制转换,位运算

下面来解释这些东西是怎么来的 原码 例如&#xff1a; 最左边的叫做符号位&#xff0c;0 为正&#xff0c;1 为负&#xff0c;后面的才是具体的数值 在计算机中&#xff0c;一个 0 或者 1 所占的空间叫 bit 中文名叫比特位&#xff0c;八个 bit 就称为一个字节&#xff0c;字…

Java+Swing学生信息管理系统(含源码+论文+答辩PPT等)

该项目采用技术&#xff1a;JDBCAWTSwing集合面向对象编程等相关技术&#xff0c;项目含有源码、文档、配套开发软件、软件安装教程、项目发布教程等 项目功能介绍&#xff1a; 系统管理&#xff1a;用户登录、退出、注册 学校管理&#xff1a;设置学生学校以及联系方式等信息 …

C语言——矩阵转置

矩阵转置的原理&#xff1a;行元素变成列元素&#xff0c;列元素变成行元素 例如&#xff1a; 矩阵转置代码 #include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<math.h>//矩阵转置 double** Matrix_T(double** arr) {if(arrNULL)e…

Linux服务器配置与管理(基于Centos7.2)任务目标(六)

文章目录一、实验目的&#xff1a;二、实验内容及基本要求&#xff1a;三、实训步骤一、实验目的&#xff1a; ●了解Shell脚本的概念和执行方法&#xff1b;能熟编写Shell脚本来管理系统 二、实验内容及基本要求&#xff1a; 1、使用脚本批量创建用户 2、使用脚本批量删除用…

【895. 最大频率栈】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 设计一个类似堆栈的数据结构&#xff0c;将元素推入堆栈&#xff0c;并从堆栈中弹出出现频率最高的元素。 实现 FreqStack 类: FreqStack() 构造一个空的堆栈。void push(int val) 将一个整数 val …

MySQL索引的底层数据结构原理剖析(二叉树、 红黑树、Hash、B-Tree、B+Tree)

一. 前言 1. 说明 我们平时所说的&#xff1a;聚集索引(主键索引)&#xff0c;次要索引&#xff0c;覆盖索引&#xff0c;复合索引&#xff0c;前缀索引&#xff0c;唯一索引在MySQL5.7和 8.0版本默认都是使用BTree索引&#xff0c;除此之外还有 Hash索引。至于MySQL5.7之前版…

Go-Excelize API源码阅读(三十八)——SetCellStyle

Go-Excelize API源码阅读&#xff08;三十八&#xff09;——SetCellStyle 开源摘星计划&#xff08;WeOpen Star&#xff09; 是由腾源会 2022 年推出的全新项目&#xff0c;旨在为开源人提供成长激励&#xff0c;为开源项目提供成长支持&#xff0c;助力开发者更好地了解开源…

智慧城市运营中心建设方案(SCOC)智慧城市的心脏

一、大数据&#xff1a;智慧城市的基础与引擎 中国每天正以消失100个村庄的速度快速步入城镇化&#xff0c;未来10年内将有5亿以上的人涌入城市。这无疑会给城市的建设带来巨大的压力&#xff0c;城市资源有限&#xff0c;规模不可能无限扩张&#xff0c;城市在就业、教育、住房…

【数据库基础】数据库介绍和三大范式

数据库简介&#x1f33e;第一章 数据库简介&#x1f54a;️1.1 简介&#x1f54a;️1.2 常见数据库管理系统&#x1f54a;️1.3 三大范式&#xff08;规范&#xff09;&#x1f375;第一范式&#xff1a;&#x1f375;第二范式:&#x1f375;第三范式&#x1f33e;第一章 数据库…