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. // 写入文件  
  6. memset(WriteBuf, 'a'sizeof(WriteBuf));  
  7. file.Write(WriteBuf, sizeof(WriteBuf));  
  8.   
  9. // 封合文件  
  10. file.Close();  
  11.   
  12. // 只读格事务署打开文件  
  13. file.Open("C://TestFile.txt", CFile::modeRead);  
  14. while (true)  
  15. {  
  16. // 读取文件数据  
  17. int ret = file.Read(ReadBuf, 100);  
  18. ……  
  19. // 如果到达文件结尾则中止循环  
  20. if (ret < 100)  
  21. break;  
  22. }  
  23.   
  24. // 封合文件  
  25. file.Close();  

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

C++代码
  1. // 创建、写入格事务署打开文件    
  2. CFile file;    
  3. file.Open("C://TestFile.txt", CFile::modeWrite | CFile::modeCreate);    
  4.     
  5. // 写入文件    
  6. memset(WriteBuf, 'a'sizeof(WriteBuf));    
  7. file.SeekToBegin();    
  8. file.Write(WriteBuf, sizeof(WriteBuf));    
  9.     
  10. // 封合文件    
  11. file.Close();    
  12.     
  13. // 只读格事务署打开文件    
  14. file.Open("C://TestFile.txt", CFile::modeRead);    
  15. while (true)    
  16. {    
  17. // 文件指针    
  18. static int position = 0;    
  19. // 移动文件指针    
  20. file.Seek(position, CFile::begin);    
  21. // 读取文件数据    
  22. int ret = file.Read(ReadBuf, 100);    
  23. position += ret;    
  24. ……    
  25.     
  26. // 如果到达文件结尾则中止循环    
  27. if (ret < 100)    
  28. break;    
  29. }    
  30.     
  31. // 封合文件    
  32. 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对银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站需要写入文件中的数据进行格式化,这样正正在文件中存储的数据就是以这里定义的格式显现的。  
  8. fileWrite.Write(buf,strlen(buf));  
除非特别注明,鸡啄米文章均为原创
转载请标明本文地址:http://www.sygjbus.cn/software/497.html
2016年1月11日
作家:鸡啄米 分类:软件开发 浏览: 评论:4