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()) {...}
典型流成员函数
输出流的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成员函数用来关闭与一个文件流相关联的磁盘文件。如果没有关闭该文件,因为文件流是对象,所以在文件流对象的生存期结束时,将自动关闭该文件。不过,应养成及时关闭不再使用的文件的习惯,以避免误操作或者干扰而产生的错误。