2020-08-21

很详细的一篇介绍
http://xiaojun123hello.blog.163.com/blog/static/361666562011101933326392/

MFC提供了CFile类方便文件的读写,首先要知道,文件的数据读取、数据写入与文件指针的操作都是以字节为单位的,数据的读取和写入都是从文件指针的位置开始的,当打开一个文件的时候,文件指针总是在文件的开头。常规方法如下:

CFile file;

file.open( LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL );

//pszFileName是文件名,可包含文件路径,若只有文件名,则默认路径为工程路径,nOpenFlags是文件打开模式,pError是打开失败时用来接收失败信息,一般设置为NULL。

nOpenFlags的常用模式有:

表1-1 CFile文件打开方式
CFile::modeCreate创建新文件,如果文件已存在,则将其长度变成0
CFile::modeNoTruncate与modeCreate组合使用,如果文件已存在,则不会将其长度变成0
CFile::modeRead以只读方式打开文件
CFile::modeReadWrite以读写方式打开文件
CFile::modeWrite以只写方式打开文件
CFile::modeNoInherit组织该文件被子项继承
CFile::shareDenyNone以共享模式打开文件,不会禁止其他进程对文件的读写
CFile::shareDenyRead禁止其他进程对文件的读操作
CFile::shareDenyWrite禁止其他进程对文件的写操作
CFile::shareExclusive以独占模式打开文件,禁止其他进程对文件的读写
CFile::typeText以文本方式打开文件
CFile::typeBinary以二进制方式打开文件

CFile::modeCreate 若打开文件不存在,则创建一个新文件,如果该文件存在,则清空它的数据。

CFile::modeNoTruncate 与CFile::modeCreate 组合使用。如果文件不存在,则创建一个新文件,如果文件存在,则保留他原本的数据。

CFile::modeRead 打开文件用于读取数据。

CFile::modeWrite 打开文件用于写入数据。

CFile::modeReadWrite 打开文件用于读取和写入数据。

CFile::typeBinary 使用二进制文件模式。此模式仅用于CFile的派生类。

CFile::typeText 使用文本文件模式。此模式仅用于CFile的派生类。

CFile默认使用二进制模式读写文件,CFile无法使用文本模式读写文件。

CFile提供了一些常用的操作函数,如表1-2所示。

表1-2 CFile操作函数
函数含义
Open打开文件
Close关闭文件
Flush刷新待写的数据
Read从当前位置读取数据
Write向当前位置写入数据
GetLength获取文件的大小
Seek定位文件指针至指定位置
SeekToBegin定位文件指针至文件头
SeekToEnd定位文件指针至文件尾
GetFileName获取文件名,如:“NOTEPAD.EXE”
GetFilePath获取文件路径,如:“C:\WINDOWS \NOTEPAD.EXE”
GetFileTitle获取文件标题,如:“NOTEPAD”
GetPosition获取当前文件指针
GetStatus获取当前文件的状态,返回一个CFileStatus
#Remove静态方法,删除指定文件
#Rename静态方法,重命名指定文件

注意最后两个静态函数,其实它们封装了Windows API中关于文件管理的函数。

使用CFile操作文件的流程如下:

构造一个CFile对象。

调用CFile::Open()函数创建、打开指定的文件。

调用CFile::Read()和CFile::Write ()进行文件操作。

调用CFile::Close()关闭文件句柄。

文件指针的位置设置可以使用:

Seek( LONG lOff, UINT nFrom ) 把文件指针移动到指定位置

lOff :是指针偏移字节数,若向后偏移则为正数,若向前偏移,则为负数。

nFrom :MSDN上有三种取值:

CFile::begin  从文件开头开始算起,lOff为正数;

CFile::current 当前位置开始算起;

CFile::end   从文件结尾开始算起,lOff为负数;

SeekToBegin( ) 把文件指针移到文件开头

SeekToEnd( ) 把文件指针移到文件末尾

GetPosition( ) 返回当前文件指针的位置

获取文件的字节数可用 GetLength( ) 此函数的返回值为DWORD,但可直接用来分配数组元素数目,例如:

DOWRD len=file.GetLength();

char *pBuf=new char[len+1] / int *pBuf=new int[len/4]

char占一个字节,int占四个字节。

写入文件:

CFile file;

file.Open(“E:\VC\1.txt”,CFile::modeCreate|CFile::modeWrite|CFile::modeNoTruncate,NULL);

file.Write(“HelloWorld”,strlen(“HelloWorld”));

//Write( const void* lpBuf, UINT nCount ) lpBuf是写入数据的Buf指针,nCount是Buf里需要写入文件的字节数

file.close( );

读取文件:

CFile file;

file.Open(“E:\VC\1.txt”,CFile::modeRead,NULL);

DWORD len=file.GetLength( );

char Buf[len+1];

Buf[len]=0; //0终止字符串,用于输出。

file.Read(Buf,len); //Read( void* lpBuf, UINT nCount ) lpBuf是用于接收读取到的数据的Buf指针nCount是从文件读取的字节数

MessageBox(Buf);

		CString CFilePath;
		
		pThis->GetDlgItemText(IDC_GET_FILE_PATH,CFilePath);
		if (CFilePath.GetLength()>5)//如果当前设置了路径,就重新写入到内存
		{
			CFile fp;
			fp.Open("_path.txt", CFile::modeWrite | CFile::modeCreate);
			fp.Write(CFilePath.GetBuffer(), CFilePath.GetLength());
			fp.Close();
		}
		else//如果本次没有设置路径,就用上次的,如果上次有的话
		{
			CFile fp;
			fp.Open("_path.txt", CFile::modeRead);
			

			if (fp.m_hFile != CFile::hFileNull)//如果存在路径记录文件,就读取,否则还按照以前的方式循环及报错
			{
				DWORD len = fp.GetLength();

				char* Buf = (char*)malloc((len + 1)*sizeof(char));
				Buf[len] = 0;  //0终止字符串,用于输出。
				fp.Read(Buf, len);   //Read( void* lpBuf, UINT nCount ) lpBuf是用于接收读取到的数据的Buf指针nCount是从文件读取的字节数
				CFilePath = CString(Buf);
				free(Buf);
				fp.Close();
			}
			else
			{
				printf("Fail to open _path.txt \n");
			}
		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值