为方便对文件操作,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]全文件名。