VS和MFC编程入门之45MFC常用类CFile文件操作类.docx
- 文档编号:10540125
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:8
- 大小:34.84KB
VS和MFC编程入门之45MFC常用类CFile文件操作类.docx
《VS和MFC编程入门之45MFC常用类CFile文件操作类.docx》由会员分享,可在线阅读,更多相关《VS和MFC编程入门之45MFC常用类CFile文件操作类.docx(8页珍藏版)》请在冰豆网上搜索。
VS和MFC编程入门之45MFC常用类CFile文件操作类
VS2010MFC编程入门之四十五(MFC常用类:
CFile文件操作类)
理解了定时器Timer的用法,这里介绍下文件操作类CFile类的使用。
CFile类概述
如果你学过C语言,应该知道文件操作使用的是文件指针,通过文件指针实现对它指向的文件的各种操作。
这些文件操作函数中有的最终还是调用了操作系统的API函数或者处理过程与之类似,例如在Windows系统中,fread函数就调用了API函数ReadFile。
Windows系统的API函数除了ReadFile,还有CreateFile、WriteFile等函数。
而MFC基于面向对象的思想,将这些WindowsAPI函数封装到了CFile类中,实现对文件的打开、关闭、读、写、获取文件信息等操作。
使用CFile类对文件进行操作非常便捷。
CFile类的成员函数
CFile();
CFile(HANDLEhFile);
CFile(LPCTSTRlpszFileName,UINTnOpenFlags);
以上三个成员函数都是CFile的构造函数,用于构造CFile对象。
参数hFile为要关联到CFile对象的文件的句柄。
参数lpszFileName为要关联到CFile对象的文件的相对路径或者绝对路径;参数nOpenFlags为文件访问选项的组合,通过各选项的按位或运算实现组合,下面的5个表列出了nOpenFlags参数可能取的选项:
下面的文件访问模式选项表中只能选择一个进行组合,默认取CFile:
:
modeRead。
取值
描述
CFile:
:
modeRead
只读方式访问文件
CFile:
:
modeWrite
写入方式访问文件
CFile:
:
modeReadWrite
读写方式访问文件
下面的文件共享模式选项表中也只能选择一个进行组合,默认的共享模式是CFile:
:
shareExclusive。
取值
描述
CFile:
:
shareDenyNone
允许其他进程对文件进行读写
CFile:
:
shareDenyRead
不允许其他进程读取文件
CFile:
:
shareDenyWrite
不允许其他进程写文件
CFile:
:
shareExclusive
禁止其他进程对文件的所有访问
下面的文件创建模式选项列表中可选择第一个或两者都选进行组合。
取值
描述
CFile:
:
modeCreate
如果文件不存在则创建文件,而如果存在则将它关联到此CFile对象并将长度截取为0
CFile:
:
modeNoTruncate
如果文件不存在则创建文件,而如果存在则将它关联到此CFile对象而不进行截取
注意,选择CFile:
:
modeNoTruncate时需要与CFile:
:
modeCreate一起使用,即CFile:
:
modeCreate|CFile:
:
modeNoTruncate。
另外,还有一个文件缓冲选项列表和一个文件安全选项。
文件缓冲选项不太常用,鸡啄米这里就不讲了,有兴趣的可以查阅MSDN。
文件安全选项是CFile:
:
modeNoInherit,意为禁止子进程继承使用此文件。
当然,在实际使用时,以上各个表并不是都要用到,大家可以根据自己的需要选择用哪个表,选择哪个选项。
virtualBOOLOpen(LPCTSTRlpszFileName,UINTnOpenFlags,CFileException*pError=NULL);
打开文件。
它通常与默认构造函数CFile:
:
CFile()一起使用。
参数lpszFileName和nOpenFlags同构造函数。
参数pError为指向文件异常对象的指针,默认为NULL。
virtualvoidClose();
关闭文件。
如果你没有在执行析构函数前调用此成员函数关闭文件,则析构函数会为你关闭。
virtualUINTRead(void*lpBuf,UINTnCount);
读取文件数据到缓存。
参数lpBuf是由用户提供的指向接收文件数据的缓存的指针;参数nCount为读取的最大字节数。
返回值是实际读取到缓存的字节数,如果到达文件尾则返回值可能会小于nCount,此时继续读取的话,会返回0,所以通常我们都会判断返回值是否小于nCount或者等于0来确定是否到达文件尾。
virtualvoidWrite(constvoid*lpBuf,UINTnCount);
将缓存中的数据写入文件。
参数lpBuf也是由用户提供,指向包含写入数据的缓存的指针;参数nCount为缓存中要被写入文件的数据的字节数。
virtualULONGLONGSeek(LONGLONGlOff,UINTnFrom);
在一个打开的文件中重定位文件指针。
参数lOff为文件指针移动的字节个数,为正数时表示向文件尾移动,为负数时表示向文件开头移动;参数nFrom为lOff的基准位置,即由nFrom位置开始移动lOff个字节,它可以取下面几个值中的一个:
CFile:
:
begin从文件开头开始移动
CFile:
:
current从文件指针的当前位置开始移动
CFile:
:
end从文件尾开始移动
文件打开时,文件指针被置于0,即文件开头处。
如果此函数成功则返回文件指针的位置。
voidSeekToBegin();
将文件指针移动到文件开头。
它等价于Seek(0L,CFile:
:
begin)。
ULONGLONGSeekToEnd();
将文件指针移动到文件末尾。
返回值是文件的字节长度。
它等价于CFile:
:
Seek(0L,CFile:
:
end)。
virtualULONGLONGGetLength()const;
获取文件的字节长度。
virtualvoidSetLength(ULONGLONGdwNewLen);
改变文件的长度。
参数dwNewLen为文件的新长度,它可能比文件的当前长度值要大或者小,文件会相应的被扩展或截取。
virtualCStringGetFileName()const;
获取文件名称。
virtualCStringGetFilePath()const;
获取文件的绝对路径。
virtualCStringGetFileTitle()const;
获取文件的显示名称。
举个例子,与GetFileName区分一下,如果你系统中的文件不显示扩展名,则它获取到的文件名称就不包含扩展名,否则就显示扩展名。
virtualULONGLONGGetPosition()const;
获取文件指针的当前位置。
staticvoidPASCALRemove(LPCTSTRlpszFileName,CAtlTransactionManager*pTM=NULL);
删除文件。
参数lpszFileName为要删除的文件路径,可以是相对路径、绝对路径或者网络路径;参数pTM指向一个CAtlTransactionManager对象。
staticvoidPASCALRename(LPCTSTRlpszOldName,LPCTSTRlpszNewName,CAtlTransactionManager*pTM=NULL);
重命名文件。
参数lpszOldName为老的文件路径;参数lpszNewName为新的文件路径;参数pTM指向一个CAtlTransactionManager对象。
实际上此函数的意义已经不只是重命名文件,还可以移动文件到其他目录下,例如,lpszOldName取"d:
\\1.txt",lpszNewName取"e:
\\2.txt",这样可以将D盘中的1.txt文件转移到E盘并重命名为2.txt。
CFile类应用实例
这里鸡啄米只给大家演示几个简单的代码片段,从这些代码片段中熟悉CFile类的文件操作。
实例一:
构造CFile对象时就打开文件,然后向文件中写入数据,最后以Seek函数移动文件指针,读取文件内容。
C++代码
charwriteBuffer[500];//要写入的数据的缓存
charreadBuffer[500];//存放读取数据的缓存
LONGLONGlOff=0;//文件指针的偏移量,也是读取到的数据的总字节数
//构造CFile对象,同时以创建和读写的方式打开文件E:
\1.txt
CFilefile(_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位置处
intnRet=file.Read(readBuffer+lOff,100);
//根据实际读取的字节数,增加文件指针的移动量
lOff+=nRet;
//如果读取数据时返回值小于指定的100,说明已到文件尾,跳出循环
if(nRet<100)
break;
}
//关闭文件
file.Close();
实际上,在Write函数和Read函数执行后,文件指针会自动移动到最后操作的位置,所以其实上面的代码中无须使用Seek函数再去手动移动文件指针。
这将在下面的实例二中体现出来。
实例二:
构造CFile对象,然后使用Open成员函数打开文件,再写入一个结构体数组,最后读取出来。
先贴上结构体的定义:
C++代码
structstudent
{
intnNum;
floatfScore;
};
下面是文件操作的代码片段:
C++代码
students1[2];//存放要写入文件的数据
students2[2];//存放从文件读取的数据
CFilefile;//CFile对象
intnReadBytes=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
intnRet=file.Read((BYTE*)s2+nReadBytes,sizeof(student));
//计算已经读取到的总字节数
nReadBytes+=nRet;
//如果读取数据时返回值小于指定的sizeof(student),则说明已到文件尾,跳出循环
if(nRet break; } //关闭文件 file.Close(); } 本节内容就到这里,如果有其他语言的文件操作的经验的话,应该还是比较简单的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VS MFC 编程 入门 45 常用 CFile 文件 操作