C++的流类库由几个进行I/O操作的基础类和几个支持特定种类的源和目标的I/O操作的类组成。

流类库的基础类

ios类是isrream类和ostream类的虚基类,用来提供对流进行格式化I/O操作和错误处理的成员函数。用关键字virtual可将公共基类说明为虚基类,虚基类的定义很难处理,这就是为什么最初的C++语言没有能支持多重继承的原因。

ios类公有派生的istream和ostream两个类分别提供对流进行提取操作和插入操作的成员函数,而iostream类通过组合istream类和ostream类来支持对一个流进行双向(也就是输入和输出)操作,它并没有提供新的成员函数。

C++流类库预定义了4个流,它们是cin、cout、cerr、clog。事实上,可以将cin视为类istream的一个对象,而将cout视为类ostream的对象。

ios_base类简介

ios_base类派生ios类,ios类又是istream类和ostream类的虚基类。

文件流

在C++里,文件操作是通过流来完成的。C++总共有输入文件流、输出文件流和输入输出文件流3种,并已将它们标准化。

要打开一个输入文件流,需要定义一个ifstream类型的对象;要打开一个输出文件流,需要定义一个ofstream类型的对象;如果要打开输入输出文件流,则要定义一个fstream类型的对象。这3种类型都定义在头文件<fstream>里。

使用文件流

(1)打开一个相应的文件流.

(2)把这个流和相应的文件关联起来。  因为ifstream、ofstream和fstream这3个类都具有自动打开文件的构造函数,而这个构造函数就具有open()的功能。因此,事实上可以用一条语句:             ofstream myStream("myText.txt");  来完成上述两步。如果指定文件路径,路径中的“\”号必须使用转义字符表示。

(3)操作文件流。

文件打开方式选项:

ios::in    = 0x01, //供读,文件不存在则创建(ifstream默认的打开方 式)
ios::out    = 0x02, //供写,文件不存在则创 建,若文件已存在则清空原内容(ofstream默认的打开方式)
ios::ate    = 0x04, //文件打开时,指针在文件最后。可改变指针的位置,常和in、out联合使用
ios::app    = 0x08, //供写,文件不存在则创建,若文件已存在则在原文件内容后写入 新的内容,指针位置总在最后
ios::trunc   = 0x10, // 在读写前先将文件长度截断为0(默认)
ios::nocreate = 0x20, //文件不存在时产生错误,常和in或app联合使用
ios::noreplace = 0x40, //文件存在时产生错误,常和out联合使用
ios::binary  = 0x80  //二进制格式文件

文件保护方式

filebuf::openprot;   //默认的兼容共享方式
filebuf::sh_none;    //独占,不共享
filebuf::sh_read;    //读共享
filebuf::sh_write;   //写共享

打开文件的方法
调用构造函数时指定文件名和打开模式

ifstream f("d:\\12.txt", ios::nocreate);         //默认以 ios::in 的方式打开文件,文件不存在时操作失败
ofstream f("d:\\12.txt");                //默认以 ios::out的方式打开文件
fstream  f("d:\\12.dat", ios::in|ios::out|ios::binary); //以读 写方式打开二进制文件

使用Open成员函数

fstream f;
f.open("d:\\12.txt",ios::out);             //利用同一对象对多个文件进行操作时要用到open函数

检查是否成功打开成功:

if (f) {...}       //对ifstream、ofstream对象可 用,fstream对象不可用。
if (f.good()) {...}

失败:

if (!f) {...}       // !运算符已经重载
if (f.fail()) {...}

demo传送门

典型流成员函数

输出流的open函数 open函数的原型如下:

void open(char const *,int filemode,int =filebuf::openprot);

它有3个参数,第一个是要打开的文件名,第2个是文件的打开方式,第3个是文件的保护方式,一般都使用默认值。第2个参数可以取如下所示的值:

ios_base::in 打开文件进行读操作,这种方式可避免删除现存文件的内容

ios_base::out 打开文件进行写操作,这是默认模式

ios_base::ate 打开一个已有的输入或输出文件并查找到文件尾

ios_base::app 打开文件以便在文件尾部添加数据

ios_base::binary 指定文件以二进制方式打开,默认为文本方式

ios_base::trunc 如文件存在,将其长度截断为零并清除原有内容

除ios_base::app方式之外,在其他几种方式下,文件刚刚打开是,指示当前读写位置的文件指针都定位于文件的开始位置,而ios_base::app使文件当前的写指针定位于文件尾。这几种方式也可以通过“或”运算符“|”同时使用。

close成员函数

close成员函数用来关闭与一个文件流相关联的磁盘文件。如果没有关闭该文件,因为文件流是对象,所以在文件流对象的生存期结束时,将自动关闭该文件。不过,应养成及时关闭不再使用的文件的习惯,以避免误操作或者干扰而产生的错误。

04-28 04:42