当前位置:文档之家› MFC文件读写

MFC文件读写

MFC文件读写.txt51自信是永不枯竭的源泉,自信是奔腾不息的波涛,自信是急流奋进的渠道,自信是真正的成功之母。





1、定义文件变量
定义文件变量格式:CStdioFile 文件变量;

例如,定义一个名称为f1的文件变量,语句如下:CStdioFile f1;



2、打开指定文件
可以直接通过CStdioFile的构造函数来打开磁盘文件,同时可以用标志位指定打开方式(只读、只写、读写等):

CStdioFile(LPCTSTR lpszFileName,UINT nOpenFlags);

其中,lpszFileName表示要打开的文件名,可以是相对路径或绝对路径

nOpenFlags设置文件打开方式标志位,可以指定用“|”连接多个标志位。下面是常用的打开标志:

CFile::typeText:以文本文件的形式打开文件

CFile::typeBinary:以二进制文件的形式打开文件

CFile::modeCreate:如果指定文件名的文件不存在,则新建文件;如果文件存在并且没有设置CFile::modeNoTruncate标志,则清空文件。

CFile::modeNoTruncate:如果文件存在,不把它的长度删除为0(即不清空文件中的数据)。

CFile::modeRead:以只读方式打开文件

CFile::modeReadWrite:以可读可写方式打开文件

CFile::modeWrite:以只写方式打开文件

CFile::shareDenyNone:文件打开后,不禁止其他进程对文件的读写操作

CFile::shareExclusive:文件打开后,禁止其他进程对文件的读写操作

CFile::shareDenyRead:文件打开后,禁止其他进程对文件的读操作

CFile::shareDenyWrite:文件打开后,禁止其他进程对文件的写操作

此外,可以不在构造函数中打开文件,而仅仅调用空的构造函数CStidoFile(),然后用CStdioFile::Open()打开文件。Open函数的前两个参数和非空构造函数的参数相同,其声明如下:

BOOL Open(LPCTSTR lpszFileName,UINT nOpenFlags,CFileException* pError=NULL);

第3个参数与打开失败时的异常处理有关。

实例1:以只读方式打开一个文件
步骤:

使用AppWizard创建一个对话框应用程序,删除其自动产生的所有控件,添加一个Button控件。双击控件,在相应的函数里添加代码:

char * pszFileName="C:\\myfile.txt";

CStdioFile myFile;

CFileException fileException;

if(!myFile.Open(pszFileName,CFile::modeCreate|CFile::typeText|CFile::modeRead),&fileException)

{

TRACE("Can't open file %s, error = %u\n",pszFileName,fileException.m_cause);

}

运行结果:如果C:\下没有myfile.txt文件,则新生成该文件。

3.向从文本文件中写入信息
CStdioFile提供了函数WriteString来向文本文件中写入文本,WriteString函数的格式如下:

void WriteString(LPCTSTR lpsz);

WriteString的参数lpsz是一个以”\0”字符结束的字符串,要把这个字符串的内容写入文件。

提示

:使用WriteString函数时,如果希望每执行一次WriteString,文本文件中的内容就会自动换行一次,那么就需要在需要换行的地方输出“\n”:

myFile.WriteString(“第1行\n”);

实例2:向文件中写入文本
建立MFC基于对话框的程序,删除自动添加的所有控件,添加一个“确定”按钮,双击按钮,按默认添加事件函数,双击按钮,在相应的函数处添加如下代码:

char* pszFileName="C:\\myfile.txt";

CStdioFile myFile;

CFileException fileException;

if(myFile.Open(pszFileName,CFile::typeText|CFile::modeCreate|CFile::modeReadWrite),&fileException)

{

myFile.WriteString("第1行\n");

CString strOrder;

strOrder.Format("%d,%.3f",66,88.88);

myFile.WriteString(strOrder);

}

else

{

TRACE("Can't open file %s,error=%u\n",pszFileName,fileException.m_cause);

}

程序运行结果:C:\myfile.txt文件中内容如下:

第1行

66,88.880

4.从文本文件中读取信息
CStidoFile提供了函数ReadString来读取文本,ReadString有两种形式,一种为:

virtual LPTSTR ReadString(LPTSTR lpsz, UINIT nMax);

ReadString函数的参数如下:

lpsz :是用户提供的一个指向字符串的指针,它用来接受从文件读出的文本,以”\0”结束。

nMax是本次所允许读入的文本字符个数,不计“\0”字符,也就是说最多能读入nMax-1个文本字符。

ReadString的返回值是一个LPTSTR类型的指针,它指向从文件读出的文本字符串,如果到达文件尾,则返回NULL。

ReadString的另一种形式为:

BOOL ReadString(CString& rString);

参数rString用来容纳从文件读出的文本。

CString版本忽略回车换行符,返回值是一个布尔值。如果返回值为FALSE,表示因到达文件尾而没有读到任何字符。

提示:每执行一次ReadString,就会自动从文本文件中读取一行数据,同时文件操作指针会自动跳转到下一行。

实例3:从文件中读取文本信息
步骤:创建基于对话框的MFC程序,删除所有自动添加的控件,添加按钮控件,为按钮添加事件,并在相应的函数处,添加如下代码:

char* pszFileName="C:\\myfile.txt";

CStdioFile myFile;

CFileException fileException;

if(myFile.Open(pszFileName,CFile::typeText|CFile::modeReadWrite),&fileException)

{

myFile.SeekToBegin();

CString str1;

myFile.ReadString(str1);

CString str2;

myFile.ReadString(str2);

AfxMessageBox(str1+str2);

}

else

{

TRACE("Can't open file %s,error=%u\n",pszFileName,fileException.m_cause);

}

myFile.Close();


本文来自CSDN博客,转载请标明出处:https://www.doczj.com/doc/7018466807.html,/wwwcs59/archive/2009/09/24/4592100.aspx


5.关闭文件
对文件的操作完成后,使用CloseFile关闭文件。

函数CStdioFile::Close关闭一个文件,

一般一个文件使用完毕就应该关闭它:

myFile.Close();





virtual void Close();
Throw(CFileException);
关闭文件和对应的CFile对象。如果在删除了对象之前没有关闭文件,那么析构函数会为你而关闭文件。如果你时用new方式创建的CFile对象,那么你必须在删除了CFile对象后关闭文件。Close函数将设置m_hFile为CFile::hFileNull。该函数和创建CFile对象函数成对使用。

virtual void Abort();
该函数和Close()函数功能一样,不同的地方有两点:Abort函数不会抛出异常和错误,将他们忽略;如果这个文件以前没有打开或者关闭则Abort就不能ASSERT。

virtual CFile* Duplicate() const;
throw(CFileException);
为已建立对象的文件在建立一个CFile对象副本。

virtual BOOL Open(LPCTSTR lpFileName,UINT nOpenFlags,CFileException* pError = NULL);
该函数执行成功则返回非0值,不成功为0。

2、从文件读入/向文件写内容函数
virtual UINT Read(void* lpbuf,UINT nCount);
throw(CFileException);
该函数返回读到缓冲区的字节长度,注意:对于读入到文件尾部,则返回的字节长度会小于、等于nCount的值。该函数表示从当前位置读入nCount个字节的内容到lpbuf缓冲区。

virtual void Write(const void *lpbuf, UINT nCount);
throw(CFileException);
该函数将缓冲区当前位置以后cCount长度的内容,写入到文件从当前位置开始的内容中,替换原来的nCount长度的内容。

virtual void Flush();
throw(CFileException);
该函数将强迫保存在文件缓冲区的任何数据写入到文件中。对于CArchive则用CArchive::Flush。

3、对文件内容位置进行定位的函数:方便我们只读入部分文件内容或者从某个选定的位置写入设计的内容。该类函数全部用在open函数之后。
virtual LONG Seek(LONG lOff , UINT nFrom);
throw(CFileException);
该函数需要定位的位置是合法的,Seek函数将返回从文件开始位置到需要定位位置的偏移量,否则会抛出CFileException异常。
LONG lOff:指的是需要移动的字节数
UINT nFrom:指的是开始查找的初始位置。该值必须是下面3个之一:CFile::begin、 CFile::current、CFileEnd(该值导致lOff为负值)
该函数用在Read/Write函数之前。loff正数为往下移,负数为往下移。
Open一个文件时,初始化的位置在文件开始出,偏移量是0。

virtual SeekToBegin();
throw(CFileException);
该函数将文件指针定位到文件头,等于Seek(0L,CFiel::begin);

DWORD SeekToEnd();
throw(CFileException);
该函数返回文件的长度,把文件指针设置为文件尾,等于Seek(0L,CFile::end)

virtual DWORD GetLength() const;
throw(CFileException);
该函数返回文件的长度,

virtual void SetLength(DWORD dwNewLen);
throw(CFileException);

该函数用来设置文件的长度,即可以大于原来的长度,也可以小于原来的长度。如果大于原来的文件长,则会在原文件后面加入空格字符,如果小于原文件则会除去后面多于的字符。

4.锁定文件内容函数
virtual void LockRange(DWORD dwPos,DWORD dwCount);
throw(CFileException);
virtual void UnLockRange(DWORD dwPos,DWORD dwCount);
throw(CFileException);

dwPos:用来标识锁定的起始位置
dwCount:用来表示锁定的字节数
锁定内容的目的是为了不让其它的进程反问这段内容,可以对一个文件的多个区域进行锁定,但是锁定的内容区域不能有重合,否则会抛出错误。

5、状态
virtual DWORD GetPosition() const;
throw(CFileException);
该函数的返回值表示得到该文件的当前指针,目的是为了使用Seek函数。用在Open函数之后。

BOOL GetStatus(CFileStatus& rStatus) const;
Static BOOL PASCAL GetStatus(LPCTSTR lpFileName,CFileStatus &rStatus);
成功获得指定文件的状态信息,返回值是TURE 非0,不成功,为FALSE 0。
CFileStatus结构的包含的域:
CTime m_ctime:文件创建的日期和时间
CTime m_mtime:文件最后被修改的日期和时间
CTime m_atime:文件最后被访问的日期和时间
LONG m_size:文件的逻辑字节长度
BYTE m_attribute:文件的属性字节
char m_szFullName[_MAX_PATH]:windows字符集中的绝对文件名。

m_attribute:MFC提供了枚举类型来表示各种文件属性。
enum Attribute {
normal = 0x00,
readOnly = 0x01,
hidden = 0x02,
system = 0x04,
volume = 0x08,
directory = 0x10,
archive = 0x20
};
CFile::GetStatus()是通过MFC的CFile对象的方式来获得相应打开文件的状态信息。不能向m_szFullName结构中插入值。必须open文件才能访问
status 方式即便文件没有正真被open一样可以获得m_szFullName信息。

virtual void SetFilePath(LPCTSTR lpNewName);
该函数是将一个文件名(该文件可以并不存在)和CFile对象建立起联系,不是为了open CFile和Create CFile。用于open或create一个CFile对象之前。
如果要操作该CFile对象,如果该文件不存在则需要建立,如果已经建立则需要打开该对象进行操作。

virtual CString GetFileName() const; 获得文件名”tmp.txt”
virtual CString GetFilePath() const; 获得文件路径名称”c:/tmp.txt”
virtual CString GetFileTitle() const; 获得文件名称”tmp”
上述3个函数只要调用了SetFilePath就可以使用,并不需求文件存在或者打开。
static void PASCAL Rename(LPCTSTR lpOldFileName, LPCTSTR lpNewFileName);
throw(CFileException);
该函数将已

经存在的文件更名为新的为存在的文件名。不能修改文件夹。该文件关联的CFile对象不能被打开。

static void PASCAL Remove(LPCTSTR lpFileName);
throw(CFileException);
该函数用来删除一个文件,该文件可以是绝对路径文件,也可以是相对路径文件,但不能是网络路径文件。同时不能删除文件夹。该文件关联的CFile对象不能被打开。

static void SetStatus(LPCTSTR lpFileName, const CFileStatus& status);
throw(CFileException);
lpFileName:可以是绝对路径文件,也可以是相对路径文件,但不能是网络路径文件。




文件错误
有很多因素会使得CFile::Open()函数调用失败,如试图打开一个不存在的文件(没有指定
CFile::modeCreate标志),试图打开一个已经被其它进程以独占方式打开的文件。在使用文件
时,一些环境的因素也能导致错误。
在如何使用CFile::Open()的示例代码中,函数返回一个Boolean值指明调用成功或者失败。
如果失败了,通常希望知道为什么该操作会失败,然后你可以将这些信息返回给用户,并且告
诉他们解决的步骤。
MFC提供CFileException类(从CException基类派生)来表示一个文件错误条件。MFC异常类
包含能让你检索产生异常的错误信息的数据成员和函数成员。
试图打开一个文件的CFile构造函数在打开失败时将抛出(产生)一个CFileException异常。
如果使用构造函数,应该将它包含在一个try/catch异常处理块中,如下所示:

try
{
CFile MyFile("MyFile.dat", CFile::modeRead);
}
catch( CFileException *fx)
{
TCHAR buf[255];
fx->GetErrorMessage(buf, 255);
CString strPrompt(buf);
AfxMessageBox(strPrompt);
}

CFile::Open()并不抛出异常。而是把它的可选的第3个参数指向一个CFileException对象的指针。
如果文件打开操作失败,该CFileException对象将被填满错误信息。这些信息可以被后面的代码用
来提供给用户,如下面的代码所示:

CFile MyFile;
CFileException fx;

if( !MyFile.Open("MyFile.dat", CFile::modeRead, &fx))
{
TCHAR buf[255];
fx->GetErrorMessage(buf, 255);
CString strPrompt(buf);
AfxMessageBox(strPrompt);
}


相关主题
文本预览
相关文档 最新文档