CFile类提供了对文件进行打开,关闭,读,写,删除,重命名以及获取文件信息等文件操作的基本功能,足以处理任意类型的文件操作。

  一个读写文件的例子:

  文件I/O

  虽然使用CArchive类内建的序列化功能是保存和加载持久性数据的便捷方式,但有时在程序中需要对文件处理过程拥有更多的控制权,对于这种文件输入输出(I/O)服务的需求,Windows提供了一系列相关的API函数,并由MFC将其封装为CFile类,提供了对文件进行打开,关闭,读,写,删除,重命名以及获取文件信息等文件操作的基本功能,足以处理任意类型的文件操作。CFile类是MFC文件类的基类,支持无缓冲的二进制输入输出,也可以通过与CArchive类的配合使用而支持对MFC对象的带缓冲的序列化。

  CFile类包含有一个公有型数据成员m_hFile,该数据成员包含了同CFile类对象相关联的文件句柄。如果没有指定句柄,则该值为CFile::hFileNull。由于该数据成员所包含的意义取决于派生的类,因此一般并不建议使用m_hFile。

  通过CFile类来打开文件可以采取两种方式:一种方式是先构造一个CFile类对象然后再调用成员函数Open()打开文件,另一种方式则直接使用CFile类的构造函数去打开一个文件。下面的语句分别演示了用这两种方法打开磁盘文件“C:/TestFile.txt”的过程:

C++代码
  1. // 先构造一个实例,然后再打开文件
  2. CFile file;
  3. file.Open(“C://TestFile.txt”, CFile::modeReadWrite);
  4. ……
  5. // 直接通过构造函数打开文件
  6. CFile file(“C://TestFile.txt”, CFile::modeReadWrite);

  其中参数CFile::modeReadWrite是打开文件的模式标志,CFile类中与之类似的标志还有十几个,现集中列表如下:

  文件模式标志 说明

  CFile::modeCreate  创建方式打开文件,如文件已存在则将其长度设置为0

  CFile::modeNoInherit  不允许继承

  CFile::modeNoTruncate 创建文件时如文件已存在不对其进行截断

  CFile::modeRead 只读方式打开文件

  CFile::modeReadWrite 读写方式打开文件

  CFile::modeWrite 写入方式打开文件

  CFile::shareCompat 在使用过程中允许其他进程同时打开文件

  CFile::shareDenyNone 在使用过程中允许其他进程对文件进行读写

  CFile::shareDenyRead 在使用过程中不允许其他进程对文件进行读取

  CFile::shareDenyWrite 在使用过程中不允许其他进程对文件进行写入

  CFile::shareExclusive  取消对其他进程的所有访问

  CFile::typeBinary 设置文件为二进制模式

  CFile::typeText 设置文件为文本模式

  这些标志可以通过“或”运算符而同时使用多个,并以此来满足多种需求。例如,需要以读写方式打开文件,如果文件不存在就创建一个新的,如果文件已经存在则不将其文件长度截断为0。为满足此条件,可用CFile::modeCreate、CFile::modeReadWrite和CFile::modeNoTruncate等几种文件模式标志来打开文件:

C++代码
  1. CFile file ("C://TestFile.txt", CFile::modeCreate | CFile::modeReadWrite | CFile::modeNoTruncate);

  在打开的文件不再使用时需要将其关闭,即可以用成员函数Close()关闭也可以通过CFile类的析构函数来完成。当采取后一种方式时,如果文件还没有被关闭,析构函数将负责隐式调用Close()函数去关闭文件,这也表明创建在堆上的CFile类对象在超出范围后将自动被关闭。由于调用了对象的析构函数,因此在文件被关闭的同时CFile对象也被销毁,而采取Close()方式关闭文件后,CFile对象仍然存在。所以,在显式调用Close()函数关闭一个文件后可以继续用同一个CFile对象去打开其他的文件。

  文件读写是最常用的文件操作方式,主要由CFile类成员函数Read()、Write()来实现。其函数原型分别为:

C++代码
  1. UINT Read( void* lpBuf, UINT nCount );
  2. void Write( const void* lpBuf, UINT nCount );

  参数lpBuf为指向存放数据的缓存的指针,nCount为要读入或写入的字节数,Read()返回的为实际读取的字节数,该数值小于或等于nCount,如果小于nCount则说明已经读到文件末尾,可以结束文件读取,如继续读取,将返回0。因此通常可以将实际读取字节数是否小于指定读取的字节数或是否为0作为判断文件读取是否到达结尾的依据。下面这段代码演示了对文件进行一次性写入和循环多次读取的处理过程:

C++代码
  1. // 创建、写入方式打开文件
  2. CFile file;
  3. file.Open("C://TestFile.txt", CFile::modeWrite | CFile::modeCreate);
  4. // 写入文件
  5. memset(WriteBuf, 'a', sizeof(WriteBuf));
  6. file.Write(WriteBuf, sizeof(WriteBuf));
  7. // 关闭文件
  8. file.Close();
  9. // 只读方式打开文件
  10. file.Open("C://TestFile.txt", CFile::modeRead);
  11. while (true)
  12. {
  13. // 读取文件数据
  14. int ret = file.Read(ReadBuf, 100);
  15. ……
  16. // 如果到达文件结尾则中止循环
  17. if (ret < 100)
  18. break;
  19. }
  20. // 关闭文件
  21. file.Close();

  Write()和Read()函数执行完后将自动移动文件指针,因此不必再显示调用Seek()函数去定位文件指针。包含有文件定位函数的完整代码如下所示:

C++代码
  1. // 创建、写入方式打开文件
  2. CFile file;
  3. file.Open("C://TestFile.txt", CFile::modeWrite | CFile::modeCreate);
  4. // 写入文件
  5. memset(WriteBuf, 'a', sizeof(WriteBuf));
  6. file.SeekToBegin();
  7. file.Write(WriteBuf, sizeof(WriteBuf));
  8. // 关闭文件
  9. file.Close();
  10. // 只读方式打开文件
  11. file.Open("C://TestFile.txt", CFile::modeRead);
  12. while (true)
  13. {
  14. // 文件指针
  15. static int position = 0;
  16. // 移动文件指针
  17. file.Seek(position, CFile::begin);
  18. // 读取文件数据
  19. int ret = file.Read(ReadBuf, 100);
  20. position += ret;
  21. ……
  22. // 如果到达文件结尾则中止循环
  23. if (ret < 100)
  24. break;
  25. }
  26. // 关闭文件
  27. file.Close();

  补充:

  使用CFile类对文件进行按结构读取,如:

C++代码
  1. CFile fileRead,fileWrite;
  2. fileRead.Open(_T("E://a.dat"),CFile::modeRead);//这里使用宏_T
  3. fileWrite.Open(_T("E://backup.txt"),CFile::modeCreate | CFile::modeWrite);
  4. VIDEOHEADER *videoheader=new VIDEOHEADER();
  5. fileRead.Read(videoheader,sizeof(VIDEOHEADER));
  6. char buf[sizeof(VIDEOHEADER)*8];
  7. sprintf(buf,"videoheader.cCommandID:%s ,videoheader->cCommandID);  //通过sprintf对我们需要写入文件中的数据进行格式化,这样在文件中存储的数据就是以这里定义的格式显示的。
  8. fileWrite.Write(buf,strlen(buf));
转自:http://www.jizhuomi.com/software/181.html

MFC CFile类读写文件详解的更多相关文章

  1. MFC读写文件详解

    1.CFile类提供了对文件进行打开,关闭,读,写,删除,重命名以及获取文件信息等文件操作的基本功能,足以处理任意类型的文件操作. 虽然使用CArchive类内建的序列化功能是保存和加载持久性数据的便 ...

  2. Mybatis SQL映射文件详解

    Mybatis SQL映射文件详解 mybatis除了有全局配置文件,还有映射文件,在映射文件中可以编写以下的顶级元素标签: cache – 该命名空间的缓存配置. cache-ref – 引用其它命 ...

  3. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...

  4. web.xml文件详解

      web.xml文件详解 Table of Contents 1 listener. filter.servlet 加载顺序 2 web.xml文件详解 3 相应元素配置 1 listener. f ...

  5. Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

  6. [转]AndroidManifest.xml文件详解

    转自:http://www.cnblogs.com/greatverve/archive/2012/05/08/AndroidManifest-xml.html AndroidManifest.xml ...

  7. VSFTPD全攻略(/etc/vsftpd/vsftpd.conf文件详解)

    /etc/vsftpd/vsftpd.conf文件详解,分好类,方便大家查找与学习 #################匿名权限控制############### anonymous_enable=YE ...

  8. jni.h头文件详解二

    作者:左少华 博客:http://blog.csdn.net/shaohuazuo/article/details/42932813 转载请注明出处:http://blog.csdn.net/shao ...

  9. 【转】 jni.h头文件详解(二)

    原文网址:http://blog.csdn.net/shaohuazuo/article/details/42932813 作者:左少华 博客:http://blog.csdn.net/shaohua ...

随机推荐

  1. 如何在Computer下添加System Folder

    1.创建一个GUID标识该系统目录,比如:{7854FF7A-470F-4D04-9FC5-4CFC7B2A0E89}.下面的操作步骤将全部使用这个示例GUID. 2.打开注册表编辑器(Registr ...

  2. Linux主机添加路由和端口转发

    环境(关闭防火墙和seLinux): 6A: CentOS6 7A 和 7B:CentOS 7 6A: 192.168.20.131/24 7B: 192.168.20.129/24 和 192.16 ...

  3. Linux(CentOS)安装JDK(.tar.gz)并配置

    本文思路转自http://blog.sina.com.cn/s/blog_81631744010137iy.html 点击(此处)折叠或打开 1.到 甲骨文(oracle)下载jdk不用多说 tar ...

  4. 7.24 IO多路复用和协程代码笔记

    1. 复习 # !/usr/bin/env python # !--*--coding:utf-8 --*-- # !@Time :2018/7/23 11:49 # !@Author TrueNew ...

  5. Saltstack生产案例之系统初始化

    把之前的配置打个包 zip -r salt.zip * 拷贝到/root/tools目录 博客园文件里面也保留一份,删除之前所有的salt配置文件重新开始 想 1,系统初始化 2,功能模块:设置单独的 ...

  6. opengl学习笔记(一)

    ubuntu下opengl的安装及配置 OpenGL 是一套由SGI公司发展出来的绘图函数库,它是一组 C 语言的函数,用于 2D 与 3D 图形应用程序的开发上.OpenGL 让程序开发人员不需要考 ...

  7. SQL Fundamentals: 分组统计查询(FROM-WHERE-GROUPBY-HAVING-SELECT-ORDER BY)

    SQL Fundamentals || Oracle SQL语言 统计函数 单字段分组统计(GROUP BY) 多字段分组统计 HAVING子句 控制操作的显示列:基本的SELECT语句 控制行:限定 ...

  8. python中super的使用方法

    说白了,super的使用就是要子类要调用父类的方法,我们就用super,那你要有调用的规范,我们明白这个规范就可以了. 在python2和python3中,调用方法不同,注意就是了.Python3.x ...

  9. iOS 项目架构tabbarController 嵌套 navbarController

    简单思路: 进入APP,首先加载 splashVC,加载完成之后,在viewDidAppear里跳转到loginVC,(这里一定要在viewDidLoad方法里新建loginVC跳转). 登陆成功之后 ...

  10. OKEx货币对价格数量长度及精度

    长度 precisions = [["bch_btc","0.001","0.00000001"], ["ltc_btc" ...