MFC中文件操作(C、C++流、CFile)


一、C语言方式文件操作

1. 打开文件:

FILE *fopen(const char *path, const char *mode);

 

打开成功返回指向该流的文件指针;打开失败返回NULL,并把错误代码存在error中。

 

mode字符串:

字符串

说明

r

以只读方式打开文件,该文件必须存在。

r+

以读/写方式打开文件,该文件必须存在。

rb+

以读/写方式打开一个二进制文件,只允许读/写数据。

rt+

以读/写方式打开一个文本文件,允许读和写。

w

打开只写文件,若文件存在则长度清为 0,即该文件内容消失,若不存在则创建该文件。

w+

打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

a

以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF 符保留)。

a+

以附加方式打开可读/写的文件。若文件不存在,则会建立该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的 EOF 符不保留)。

wb

以只写方式打开或新建一个二进制文件,只允许写数据。

wb+

以读/写方式打开或建立一个二进制文件,允许读和写。

wt+

以读/写方式打开或建立一个文本文件,允许读写。

at+

以读/写方式打开一个文本文件,允许读或在文本末追加数据。

ab+

以读/写方式打开一个二进制文件,允许读或在文件末追加数据。

b

二进制文件

t

文本文件

 

2. 获取文件字节长度(文件大小)

流程:

获取文件位置指针当前位置(ftell-->偏移至文件尾(fseek--->再次调用ftell函数,即可得到文件大小-->再次调用fseek还原文件位置指针

 

首先得到文件位置指针当前位置相对于文件首的偏移字节数,ftell()函数:

 

long ftell(FILE *stream);

 

注意:因为ftell返回long型,根据long型的取值范围-231~231-1-21474836482147483647),故对大于2.1G的文件进行操作时出错。

 

②将文件位置指针指向文件尾,fseek()函数:

 

int fseek(FILE *stream, long offset, int fromwhere);

 

fromwhere处偏移offset个字节单位,其中,fromwhere有三种表示方式:SEEK_SET(文件头0)、SEEK_CUR(当前位置1)、SEEK_END(文件尾2)。

 

可以采用fseek(stream, 0, SEEK_END);的方法将文件位置指针指向文件尾。

 

③再次调用ftell函数,即可获取文件长度:length

long length = ftell(stream);

 

④根据首次得到的文件位置指针,调用fseek函数将文件位置指针还原。

fseek(stream, stPt, SEEK_SET);

 

3. 读取文件

size_t fread(void *buffer, size_t size, size_t count, FILE *stream);

从给定流 stream 读取数据到 buffer所指向的数组中。

 

buffer: 空间至少size_t *count字节。

size:要读取的每个元素的大小,以字节为单位。

count:要读取的元素个数,每个元素的大小为size字节。

size_tlong

 

返回值:返回真实读取的元素个数count,若大于count则意味着产生了错误。另外,产生错误后,文件位置指示器是无法确定的。若其他streambuffer为空指针,或在unicode模式中写入的字节数为奇数,此函数设置errnoEINVAL以及返回0

 

4. 向文件写入数据

size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);

 

buffer:要写入的数据。

size:要被写入的每个元素的字节大小。

count:元素的个数,每个元素的大小为size字节。

 

返回值:成功返回实际写入的元素个数count,失败返回-1

 

5. 清除读写缓冲区

int fflush(FILE *stream);

 

清除读写缓冲区,需要立即把输出缓冲区的数据进行物理写入时。

fflush()会强迫将缓冲区内的数据写回参数stream 指定的文件中. 如果参数stream NULL,fflush()会将所有打开的文件数据更新。、

 

返回值:如果成功,该函数返回零值。如果发生错误,则返回 EOF,且设置错误标识符(即 feof)。

 

6. 关闭文件

int fclose(FILE *stream);

 

关闭stream流。注意:使用fclose()函数就可以把缓冲区内最后剩余的数据输出到内核缓冲区,并释放文件指针和有关的缓冲区。

 

返回值:如果成功,该函数返回零值。如果发生错误,则返回 EOF,且设置错误标识符(即 feof)。

 

关闭文件之后,将流stream指向NULL


二、C++方式文件操作

头文件:#include <fstream>

 

输出流:ostream (output stream)

输出流:istream (input stream)

输入输出流:iostream

写操作(输出)的文件类 ofstream

读操作(输入)的文件类:ifstream

可同时读写操作的文件类:fstream (file stream)

 

typedef basic_fstream<char, char_traits<char> > fstream;

实际应用时,使用fstream代替basic_fstream

 

需要一个fstream类对象,调用fstream类成员函数来进行相关操作。

 

1.  打开文件

void basic_fstream::open(const char *_Filename, ios_base::openmode_Mode);

 

其中,openmode:

ios::app 以追加的方式打开文件。

ios::ate 文件打开后定位到文件尾,ios:app就包含有此属性。

ios::binary 以二进制方式打开文件,缺省的方式是文本方式。

ios::in 文件以输入方式打开。

ios::out 文件以输出方式打开。

ios::nocreate:不建立文件,所以文件不存在时打开失败。

ios::noreplace:不覆盖文件,所以保存文件时如果文件存在失败。

ios::trunc 如果文件存在,把文件长度设为0

 

2.  获取文件长度

pos_type basic_istream::tellg();

 

pos_type: long

 

得到文件位置指针当前位置。

 

②偏移文件位置指针:

fstream::seekg(streamoffset offset, seek_dir origin);

 

origin枚举变量:

ios::beg  文件开头处

ios::cur  文件当前位置

ios::end  文件结尾

 

3.  读取文件

basic_istream::read(char *buffer, long size);

 

读取size个字符至buffer中。

返回值:返回文件描述符(The stream (*this))。

 

4. 写入文件

basic_ostream &write(char *buffer, long size);

 

写入size个字符至buffer中。

返回值:basic_ostream对象的引用。

 

5. 关闭文件

void basic_fstream::close();

 

关闭文件。


三、使用CFile类进行文件操作

 

CFileMFC文件类的基类,它直接提供非缓冲的二进制磁盘输入/输出设备,并间接地通过派生类支持文本文件和内存文件。CFileCArchive类共同使用,支持MFC对象的串行化。

 

1. 打开文件

BOOL CFile::Open(LPCTSTR FileName, UINT nOpenFlags, CfileException *pError = NULL);

 

其中,nOpenFlags

* CFile::modeRead 只读方式打开。

* CFile::modeReadWrite 读写方式打开。

* CFile::modeWrite 只写方式打开。

* CFile::modeNoInherit 阻止这个文件被子进程继承。

* CFile::shareDenyNone 打开这个文件同时允许其它进程读写这个文件。如果文件被其它进程以兼容的模式打开,这时create操作会失败。

* CFile::shareDenyRead 打开文件拒绝其它任何进程读这个文件。如果文件被其它进程用compatibility模式或者是读方式打开,create操作失败

* CFile::shareDenyWrite 打开文件拒绝其它任何进程写这个文件。如果文件被其它进程用compatibility模式或者是写方式打开,create操作失败

* CFile::shareExclusive 以独占方式打开这个文件,不允许其它进程读写这个文件。如果文件已经在其它程序或当前程序以其他方式打开来进行读写,将返回失败。

* CFile::shareCompat 这个标志在32位的MFC中无效。

* CFile::typeText 设置成对回车换行对有特殊处理的文本模式(仅用在派生类中)。

* CFile::typeBinary 设置二进制模式(仅用在派生类中)

 

返回值:成功返回非0值,失败返回0

 

2. 获取文件字节大小(长度)

ULONGLONG CFile::GetLength() const;

 

ULONGLONG: long

 

返回文件长度。

 

3. 读取数据

UINT CFile::Read(void *lpBuf, UINT nCount);

 

nCount: 从文件中读取的最大字节数。对于文本模式文件,将回车-换行对视为单个字符。

 

返回值:传输到缓冲区的字节数。注意,对于所有的Cfile类,返回文件的值可能小于NCUT

 

4. 写入数据

void CFile::Write(const void *lpBuf, UINT nCount);

 

nCount: 要从缓冲区传输的字节数。

 

5. 关闭文件

void CFile::Close();

 

关闭文件,CFile类中的虚函数。

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页