MFC:CFile类的使用

server/2024/12/15 17:32:59/

       为方便对文件操作,MFC提供了CFile类用于文件的读写操作,具体包括文件数据的读取、写入以及文件内部指针的移动等。打开文件时,会有一个指向该文件的指针,同时还生成一个指向具体数据的内部指针,用于记录读取或写入的位置,文件刚打开时,内部指针指向文件开始位置,随着读或写的操作,内部指针会自动移动位置。内部指针移动可通过相关函数进行,移动的单位为字节。
一、使用CFile操作文件的步骤:
(一)、构造CFile类对象
         CFile 参1; //参1 CFile对象名
(二)、调用CFile::Open()函数创建或打开指定文件
          格式:file.open( 
                            LPCTSTR lpszFileName, 
                            UINT nOpenFlags, 
                            CFileException* pError = NULL );
                 参1 文件名(可包含路径,只有文件名,默认为项目目录)
                 参2 文件打开模式,取值包括:
                        CFile::modeCreate //创建新文件,如文件已存在,则将长度变成0
                        CFile::modeNoTruncate  //创建新文件,如果文件已存在,写入内如追加在最后
                        CFile::modeRead //以只读方式打开文件
                        CFile::modeReadWrite //以读写方式打开文件
                        CFile::modeWrite //以只写方式打开文件
                        CFile::typeText //以文本方式打开文件
                        CFile::typeBinary //以二进制方式打开文件
                 参3 pError //打开失败时用来接收失败信息,一般使用其默认值NULL
(三)、调用CFile::Write()函数写入文件
          使用格式:
              CFile::Write( 
                        const void* lpBuf,
                        UINT nCount)
                 参1 准备写入的字符串变量指针
                 参2 写入的字节数
         说明:
         a. Write()是CFile类对象成员函数,需要CFile类对象或指针调用。
         b. 参1 lpBuf是指向写入数据的指针,类型可以是char*或TCHAR*。如要写入的内容在CString对象中,应先将其转为char*或TCHAR*。如希望使用CString对象的成员函数GetLength获取字符串长度来计算参2所用的字节数,应注意在UNICODE字符集下使用TCHAR每个字符的字节数是2(所谓宽字符)。类似的CFile类对象也有一个同名函数GetLength,得到的结果是字节数,宽字符条件下换成字符数要除以2;这两个函数要注意区别。
        c.鉴于参1的类型,写入的内容都是字符串,无论是char*还是TCHAR*。因此,每次写入都是一个字符串;如字符串中包结束符"\0",即使未超过参2的字节数,但结束符后边的内容也不会被写入文件。
        d.如果是写入数组,合理的做法是开循环,一次只写入一个元素的长度,分次写入。如果是自定义类数组,也是开循环,在循环内将自定义类的各个属性再转成字符串后分次写入。
(四)、调用CFile::Read()读取文件
       使用格式:
             CFile::Read(
                   void* lpBuf,
                  UINT nCount ) 
             参1:lpBuf是用于接收读取到的字符串的指针
             参2:nCount是从文件读取的字节数
     说明:
     a.CFIle::Read函数是CFile类的成员函数,需要CFile对象或指针调用。
     b.参2可通过CFile::GetLength()获得(字节数)。
     c.如果文件中的数据是数组,读取方法是把上面介绍的写入方法反过来。具体是提前定义好一个接收数组,然后按数组元素个数开循环,读取后转成需要的类型依次存入数组;如是自定义类数组,在循环中读取各属性后转成需要的类型存入数组。
     d.TCHAR与相关类型转换函数:
        CString类型转成TCHAR[]的函数:wcscpy_s(tchar*,cstring)
        int转成TCHAR字符串函数:wsprintf(tchar*,L"格式字符串",int)
        TCHAR字符串可直接赋值给CString对象:CString a=(TCHAR[]) b
        TCHAR字符串转int:int=_wtoi(TCHAR* pTchar)
(五)、调用CFile::Close()关闭
      使用格式:
          CFile::Close(); //无参
      说明:
      a. CFile::Close()是CFile类的成员函数,需CFile类对象或指针调用。
      b. Close对应的是Open函数,CFile类对象还在,我们仍可以使用Open函数重新打开或打开其它文件。
二、CFile类的其它成员函数
    CFile::Flush();
      功能:刷新待写的数据
      参数:无
    CFile::GetLength();
      功能:获取文件的大小
      参数:无
      返回值:无符号长整型类型的从文件开始至文件尾的字节数
    CFile::Seek(参1,参2);
      功能:定位文件内部指针指向指定位置
      参数:
          参1 偏移量(单位:字节),负值表示向回移动
          参2 起始位置(取值:CFile::begin,CFile::current,CFile::end)
      返回值:返回从文件开始位置至移动后位置的字节数
    CFile::SeekToBegin();
      功能:定位文件内部指针至文件头
      参数:无
      返回值:无
    CFile::SeekToEnd();
      功能:定位文件内部指针至文件尾
      参数:无
      返回值:返回文件长度(字节数),类型为无符号长整形
    CFile::GetFileName();
      功能:获取文件名
      参数:无
      返回值:返回CString类型的文件名字符串
    CFile::GetFilePath();
      功能:获取文件路径及文件名
      参数:无
      返回值:返回CString类型的字符串
    CFile::GetPosition();
      功能:获得当前文件内部指针的读写位置
      参数:无
      返回值:返回无符号长整型(DWORD)类型的内部指针位置
   CFile:: GetStatus();
      功能:取当前文件的状态
      参数:CFileStatus对象
      返回值:成功返回true,失败返回false
      说明:CFileStatus对象的属性包括,m_ctime文件创建的时间、m_mtime文件最后一次修改的时间、m_atime最后一次访问文件并读取的时间、m_size文件逻辑长度(以字节数表示)、m_attribute文件属性字节、m_szFullName[_MAX_PATH]全文件名。
 


http://www.ppmy.cn/server/150399.html

相关文章

linux下socket本地套接字通讯

使用套接字除了可以实现网络间不同主机间的通信外,还可以实现同一主机的不同进程间的通信,且建立的通信是双向的通信。socket进程通信与网络通信使用的是统一套接口,只是地址结构与某些参数不同。 用途 进程间通信:本地套…

Redis 附加功能(一) - 数据库

Redis的数据会被存储到一个名为数据库的容器中。一个Redis服务器可以包含多个数据库,默认情况下,会创建16个数据库。这些数据库用号码进行标志,第一个数据库为0号数据库。 数据库 切换到指定的数据库:SELECT index 获取所有与给定…

在Windows 10中使用SSH远程连接服务器(附花生壳操作方法)

SSH 在 linux 中是一种重要的系统组件,用户可以使用 SSH 来远程连接 linux 系统的计算机,或者传输文件。不过在 win10 以前,windows 并不原生支持 SSH,需要借助第三方工具来使用 SSH 功能。而实际上,微软在 2015 年就曾…

redis集群 服务器更换ip,怎么办,怎么更换redis集群的ip

redis集群 服务器更换ip,怎么办,怎么更换redis集群的ip 1、安装redis三主三从集群2、正常状态的redis集群3、更改redis集群服务器的ip 重启服务器 集群会down4、更改redis集群服务器的ip 重启服务器 集群down的原因5、更改redis集群服务器的ip后&#xf…

Python中定义抽象基类

What python中定义可以定义抽象类,和Java中的抽象类是一样的,不能被直接实例化,而是作为一个基类,主要用于定义一组接口规范,接口的实现在继承其的子类中完成,并且要求子类必须实现定义的所有接口&#xf…

es build 使用配置详解:快速、可扩展的 JavaScript 打包器

引言 es build 是一个快速、可扩展的 JavaScript 打包器和压缩器,它的目标是成为最快的打包器。它使用 Go 编写,可以在几乎瞬间内完成大多数项目的构建。在本文中,我们将深入了解 es build,并探讨其如何实现如此出色的性能。 什…

如何使用 Python 写入文本文件 ?

在Python编程中,写入文本文件是一项基本且重要的操作。 无论是生成日志文件、配置文件,还是进行数据输出,都需要用到这一技能。 下面,我将详细介绍如何使用Python写入文本文件,并提供一些实际开发中的建议和注意事项…

MySQL 记录锁+间隙锁防幻读方案

1. 什么是幻读? 定义: 幻读是指在事务过程中,一个事务执行了某些查询操作后,另一事务插入、删除或更新了满足查询条件的新数据,当第一个事务再次执行相同的查询操作时,结果集出现了“幻觉”&#…