MFC读写文件详解 |
您所在的位置:网站首页 › cfileread › MFC读写文件详解 |
1.CFile类提供了对文件进行打开,关闭,读,写,删除,重命名以及获取文件信息等文件操作的基本功能,足以处理任意类型的文件操作。 虽然使用CArchive类内建的序列化功能是保存和加载持久性数据的便捷方式,但有时在程序中需要对文件处理过程拥有更多的控制权,对于这种文件输入输出(I/O)服务 的需求,Windows提供了一系列相关的API函数,并由MFC将其封装为CFile类,提供了对文件进行打开,关闭,读,写,删除,重命名以及获取文件信息等文件操作的基本功 能,足以处理任意类型的文件操作。CFile类是MFC文件类的基类,支持无缓冲的二进制输入输出,也可以通过与CArchive类的配合使用而支持对MFC对象的带缓冲的序列化。 CFile类包含有一个公有型数据成员m_hFile,该数据成员包含了同CFile类对象相关联的文件句柄。如果没有指定句柄,则该值为CFile::hFileNull。由于该数据成员所包含的 意义取决于派生的类,因此一般并不建议使用m_hFile。 通过CFile类来打开文件可以采取两种方式:一种方式是先构造一个CFile类对象然后再调用成员函数Open()打开文件,另一种方式则直接使用CFile类的构造函数去打开 一个文件。下面的语句分别演示了用这两种方法打开磁盘文件“C:/1.txt”的过程: CFile file; file.open("C://1.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等几种文件模式标志来打开文件: CFile file("C://1.txt",CFile::modeCreate|CFile::modeReadWrite|CFile::modeNoTruncate); 在打开的文件不再使用时需要将其关闭,即可以用成员函数Close()关闭也可以通过CFile类的析构函数来完成。当采取后一种方式时,如果文件还没有被关闭,析构函数将负 责隐式调用Close()函数去关闭文件,这也表明创建在堆上的CFile类对象在超出范围后将自动被关闭。由于调用了对象的析构函数,因此在文件被关闭的同时CFile对象也被销 毁,而采取Close()方式关闭文件后,CFile对象仍然存在。所以,在显式调用Close()函数关闭一个文件后可以继续用同一个CFile对象去打开其他的文件。 文件读写是最常用的文件操作方式,主要由CFile类成员函数Read()、Write()来实现。其函数原型分别为: UINT Read(void *lpBUF,UINT nCount); void Write(const void* lpBuf,UINT nCount); 参数lpBuf为指向存放数据的缓存的指针,nCount为要读入或写入的字节数,Read()返回的为实际读取的字节数,该数值小于或等于nCount,如果小于nCount则说明已经读 到文件末尾,可以结束文件读取,如继续读取,将返回0。因此通常可以将实际读取字节数是否小于指定读取的字节数或是否为0作为判断文件读取是否到达结尾的依据。下面这 段代码演示了对文件进行一次性写入和循环多次读取的处理过程: CFile file; file.Open("C://TestFile.txt", CFile::modeWrite | CFile::modeCreate); memset(WriteBuf, 'a', sizeof(WriteBuf)); file.Write(WriteBuf, sizeof(WriteBuf)); file.Close(); file.Open("C://TestFile.txt", CFile::modeRead); while (true) { int ret = file.Read(ReadBuf, 100); if (ret |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |