C++面向对象程序设计 - 文件操作与文件流

06-15 1559阅读

        在实际应用中,常以磁盘文件作为对象,即能从磁盘文件读取数据,也能将数据输出到磁盘文件,磁盘是计算机的外部存储器,能够长期保留信息,能读能写,可以刷新重写等等。

        在C++中,文件操作通常通过文件流(file streams)来完成,这是库提供的功能。fstream库中的三个主要类用于文件操作:ifstream(用于输入文件),ofstream(用于输出文件)和fstream(用于双向文件操作)。

C++面向对象程序设计 - 文件操作与文件流

一、文件的概念

        常用的文件有两大类:一类是程序文件(program file),如C++的源程序文件(.cpp)、目标文件(.obj)、可执行文件(.exe)等。一类是数据文件(data fle)在程序运行时,常常需要将一些数据输出到磁盘上存放起来,后期需要时再从磁盘中输入到计算内存,这种磁盘文件就是数据文件。

        文件数据的组织形式,可分为ASCII文件和二进制文件。ASCII文件又称文本(text)文件或字符文件,它的每一个字节放一个ASCII码,代表一个字符。二进制文件又称为内部格式文件或字节文件,是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。

        C++提供了低的I/O功能和高级I/O功能。高级的I/O功能是把若干个字节组合为一个有意义的单位(如整数、单精度数、双精度数、字符串或用户自定义的类型的数据),然后以ASCII码字符形式输入和输出(但在传输大容量的文件时由于数据格式转换,速度较慢,效率不高)。低级的I/O功能是以字节为单位输入和输出的,在输入和输出时不进行数据格式的转换,以二进制形式进行的(这种输入输出速度快、效率高、但会感到不方便)。

二、文件流类与文件流对象

        文件流是以外存文件为输入输出对象的数据流,输出文件流是从内存流向外存文件的数据,输入文件是从外存文件流向内存的数据,每一个文件流都有一个内存缓冲区与之对应。

        标准输入输出流istream、ostream和iostream类外,还有3个用于文件操作的文件类:

  1. ifstream类,它是从istream类派生的,用来支持从磁盘文件的输入。
  2. ofstream类,它是从ostream类派生的,用来支持从磁盘文件的输出。
  3. fstream类,它是从iostream类派生的,用来支持从磁盘文件的输入输出。

三、文件的打开与关闭

        对磁盘文件的操作是通过文件流对象(面不是cin和cout)实现的,文件流对象是用文件流类定义的,而不是用istream和ostream类来定义。例如建立一个输出文件流对象:

ofstream outfile;

3.1 打开磁盘

        所谓打开文件是一种形象的说法,打开文件是指在文件读写之前做的必须准备,如:

  1. 为文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件。
  2. 指定文件的工作方式,如该文件是作为输入文件还是输出文件,是ASCiI文件还是二进制文件等。

        打开文件可以两种形式,具体如下:

1)调用成员函数open形式

文件流对象.open(磁盘文件名, 输入输出方式);

        示例如下:

ofstream outfile;
outfile.open("file.txt", ios::out);

        磁盘文件名可以包括路径,如“c:\new\file.txt”,如缺省路径,则默认为当前目录下的文件。

2)在定义文件流对象时指定参数

        在声明文件流类时定义了带参数的构造函数,其中包括了打开磁盘文件的功能。示例如下:

ofstream outfile("file.txt", out;:out);

        输入输出方式是在ios类中定义的,它们是枚举常量,有多种选择,具体如下表:

方式作用
ios::in以输入方式打开文件
ios::out以输出方式打开文件(这是默认方式),如果已有此名字的文件,则将其原有内容全部清除
ios::app以输出方式打开文件,写入的数据添加在文件末尾
ios::ate打开一个已有的文件,文件指针指向文件末尾
ios::trunc打开一个文件,如果文件已存在,则删除其中全部数据,如文件不存在,则建立新文件。如已指定了ios::out方式,而末指定ios::app、ios::ate、ios::in,则同样默认此方式。
ios::binary以二进制方式打开一个文件,如不指定此方式则默认为ASCII方式
ios::nocreate打开一个已有的文件,如文件不存在,则打开失败。nocreate的意思是不建立新文件
ios::noreplace如文件不存在则建立新文件,如果文件已存在则操作失败,noreplace的意思是不更新原有文件
ios::int|ios::out以输入和输出方式打开文件,文件可读可写
ios::out|ios::binary以二进制方式打开一个输出文件
ios::in|ios::binary以二进制方式打开一个输入文件

        注意:

  1. 新版本 C++系统I/O类库中不提供ios::nocreate和ios::noreplace。
  2. 每一个打开的文件都有一个文件指针,该指针的初始位置由I/O方式指定,每次读写都从文件指针的当前位置开始。每读入一个字节,指针就后移一个字节。当文件指针移到最后,就会遇到文件结束EOF(文件结束符也占一个字节,其值为-1)此时流对像的成员函数eof的值为非0值(一般设为1),表示文件结束。
  3. 要以用“位或”运算符“|”对输入输出方式进行组合。

        示例:

#include 
#include 
using namespace std;
int main(){
	ofstream outfile;
	outfile.open("file.txt", ios::app);
	if(!outfile.is_open()){
		clog 

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]