6_4、MFC常用类:CFile

6_4、MFC常用类:CFileWindows 系统的 API 函数有 ReadFile 还有 CreateFile WriteFile 等函数

大家好,欢迎来到IT知识分享网。

1、简介

1.1 CFile类的成员函数

  1. CFile( );
    CFile(HANDLE hFile);
    CFile(LPCTSTR lpszFileName,UINT nOpenFlags);
    以上三个成员函数都是CFile的构造函数,用于构造CFile对象。参数hFile为要关联到CFile对象的文件的句柄。参数lpszFileName为要关联到CFile对象的文件的相对路径或者绝对路径;参数nOpenFlags为文件访问选项的组合,通过各选项的按位或运算实现组合,下面的5个表列出了nOpenFlags参数可能取的选项:
    在这里插入图片描述



  1. virtual BOOL Open(LPCTSTR lpszFileName,UINT nOpenFlags,CFileException* pError = NULL);
    打开文件。它通常与默认构造函数CFile::CFile()一起使用。参数lpszFileName和nOpenFlags同构造函数。参数pError为指向文件异常对象的指针,默认为NULL。
  2. virtual void Close( );
    关闭文件。如果你没有在执行析构函数前调用此成员函数关闭文件,则析构函数会为你关闭。
  3. virtual UINT Read(void* lpBuf,UINT nCount);
    读取文件数据到缓存。参数lpBuf是由用户提供的指向接收文件数据的缓存的指针;参数nCount为读取的最大字节数。返回值是实际读取到缓存的字节数,如果到达文件尾则返回值可能会小于nCount,此时继续读取的话,会返回0,所以通常我们都会判断返回值是否小于nCount或者等于0来确定是否到达文件尾。
  4. virtual void Write(const void* lpBuf,UINT nCount);
    将缓存中的数据写入文件。参数lpBuf也是由用户提供,指向包含写入数据的缓存的指针;参数nCount为缓存中要被写入文件的数据的字节数。
  5. virtual ULONGLONG Seek(LONGLONG lOff,UINT nFrom);
    在一个打开的文件中重定位文件指针。参数lOff为文件指针移动的字节个数,为正数时表示向文件尾移动,为负数时表示向文件开头移动;参数nFrom为lOff的基准位置,即由nFrom位置开始移动lOff个字节,它可以取下面几个值中的一个:
    CFile::begin 从文件开头开始移动
    CFile::current 从文件指针的当前位置开始移动
    CFile::end 从文件尾开始移动
    文件打开时,文件指针被置于0,即文件开头处。如果此函数成功则返回文件指针的位置。




  6. void SeekToBegin( );
    将文件指针移动到文件开头。它等价于Seek( 0L, CFile::begin )。
  7. ULONGLONG SeekToEnd( );
    将文件指针移动到文件末尾。返回值是文件的字节长度。它等价于CFile::Seek( 0L, CFile::end )。
  8. virtual ULONGLONG GetLength( ) const;
    获取文件的字节长度。
  9. virtual void SetLength(ULONGLONG dwNewLen);
    改变文件的长度。参数dwNewLen为文件的新长度,它可能比文件的当前长度值要大或者小,文件会相应的被扩展或截取。
  10. virtual CString GetFileName( ) const;
    获取文件名称。
  11. virtual CString GetFilePath( ) const;
    获取文件的绝对路径。
  12. virtual CString GetFileTitle( ) const;
    获取文件的显示名称。举个例子,与GetFileName区分一下,如果你系统中的文件不显示扩展名,则它获取到的文件名称就不包含扩展名,否则就显示扩展名。
  13. virtual ULONGLONG GetPosition( ) const;
    获取文件指针的当前位置。
  14. static void PASCAL Remove(LPCTSTR lpszFileName,CAtlTransactionManager* pTM = NULL);
    删除文件。参数lpszFileName为要删除的文件路径,可以是相对路径、绝对路径或者网络路径;参数pTM指向一个CAtlTransactionManager对象。
  15. static void PASCAL Rename(LPCTSTR lpszOldName,LPCTSTR lpszNewName,CAtlTransactionManager* pTM = NULL);
    重命名文件。参数lpszOldName为老的文件路径;参数lpszNewName为新的文件路径;参数pTM指向一个CAtlTransactionManager对象。实际上此函数的意义已经不只是重命名文件,还可以移动文件到其他目录下,例如,lpszOldName取”d:\1.txt”,lpszNewName取”e:\2.txt”,这样可以将D盘中的1.txt文件转移到E盘并重命名为2.txt。

2、实例

2.1 示例一

构造CFile对象时就打开文件,然后向文件中写入数据,最后以Seek函数移动文件指针,读取文件内容。

char writeBuffer[500]; // 要写入的数据的缓存  char readBuffer[500]; // 存放读取数据的缓存  LONGLONG lOff = 0; // 文件指针的偏移量,也是读取到的数据的总字节数  // 构造CFile对象,同时以创建和读写的方式打开文件E:\1.txt  CFile file(_T("e:\\1.txt"), CFile::modeCreate | CFile::modeReadWrite); // 将写入数据的缓存中每个字节都赋值为字符c  memset(writeBuffer, 'c', sizeof(writeBuffer)); // 将数据写入到文件中  file.Write(writeBuffer, sizeof(writeBuffer)); while (true) { 
    // 以文件开头为基准,移动文件指针到lOff的位置  file.Seek(lOff, CFile::begin); // 读取100个字节的数据到存放读取数据的缓存的readBuffer + lOff位置处  int nRet = file.Read(readBuffer + lOff, 100); // 根据实际读取的字节数,增加文件指针的移动量  lOff += nRet; // 如果读取数据时返回值小于指定的100,说明已到文件尾,跳出循环  if (nRet < 100) break; } // 关闭文件  file.Close(); 
  • 实际上,在Write函数和Read函数执行后,文件指针会自动移动到最后操作的位置,所以其实上面的代码中无须使用Seek函数再去手动移动文件指针。这将在下面的实例二中体现出来。

2.2 示例二

构造CFile对象,然后使用Open成员函数打开文件,再写入一个结构体数组,最后读取出来。

struct student { 
    int nNum; float fScore; }; 
student s1[2]; // 存放要写入文件的数据  student s2[2]; // 存放从文件读取的数据  CFile file; // CFile对象  int nReadBytes = 0; // 从文件中读取到的总字节数  // 为s1数组各元素赋值  s1[0].nNum = 22; s1[0].fScore = 91.5; s1[1].nNum = 23; s1[1].fScore = 85; // 以创建、读写方式打开文件E:\1.txt  if (file.Open(_T("E:\\1.txt"), CFile::modeCreate | CFile::modeReadWrite)) { 
    // 写入数据s1结构体数组  file.Write(s1, sizeof(s1)); // 因为上面调用Write以后文件指针在文件尾,所以需要将其移动到文件开头  file.SeekToBegin(); while (true) { 
    // 读取数据到s2  int nRet = file.Read((BYTE*)s2 + nReadBytes, sizeof(student)); // 计算已经读取到的总字节数  nReadBytes += nRet; // 如果读取数据时返回值小于指定的sizeof(student),则说明已到文件尾,跳出循环  if (nRet < sizeof(student)) break; } // 关闭文件  file.Close(); } 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/129991.html

(0)
上一篇 2025-08-20 14:26
下一篇 2025-08-20 14:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信