一、流类的继承关系
在C++语言中,为数据的输入和输出定义了一系列类库,主要包括:
ios,istream,ostream,iostream,ifstream,ofstream,fstream,istrstream,ostrstream,strstream等,其中ios为根基类,其余都是它的直接或间接派生类。其关系如图13-1所示。
ios为根基类,它直接派生四个类:输入流类istream、输出流类ostream、文件流基类fstreambase和串流基类strstreambase,输入文件流类同时继承了输入流类和文件流基类(当然对于根基类是间接继承),输出文件流类ofstream同时继承了输出流类和文件流基类,输入串流类istrstream同时继承了输入流类和串流基类,输出串流类ostrstream同时继承了输出流类和串流基类,输入输出流类iostream同时继承了输入流类和输出流类,输入输出文件流类fstream同时继承了输入输出流类和文件流基类,输入输出串流类strstream同时继承了输入输出流类和串流基类。
二、流类库的文件包含关系
各个流类在文件中的包含关系如表13-1。
表13-1 流类包含关系
分 类
|
类 名
|
说 明
|
包含文件
|
抽象流基类
|
ios
|
流基类
|
ios
|
输入流类
|
istream
|
通用输入流类和其他输入流的基类
|
istream
|
ifstream
|
输入文件流类
|
fstream
|
istringstream
|
输入串流类
|
sstream
|
输出流类
|
ostream
|
通用输出流类和其他输出流的基类
|
ostream
|
ofstream
|
输出文件流
|
fstream
|
ostringstream
|
输出串流
|
sstream
|
输入/输出流类
|
iostream
|
通用输入/输出流类和其他输入/输出流类的基类
|
istream
|
fstream
|
输入/输出文件流类
|
fstream
|
stringstream
|
输入/输出串流类
|
sstream
|
流缓冲区类
|
streambuf
|
抽象流缓冲区基类
|
streambuf
|
filebuf
|
磁盘文件的流缓冲区类
|
fstream
|
stringbuf
|
串的流缓冲区类
|
sstream
|
当程序需要进行标准I/O操作的时候,必须包含头文件iostream。
当程序需要进行文件I/O操作的时候,必须包含头文件fstream。
当程序需要进行串I/O操作的时候,必须包含头文件sstream。
三、预定义流类对象
C++语言系统不仅定义了大量的输入输出流库供用户使用,还定义了四个常用的类对象,方便用户进行标准的I/O操作,如表13-2。
表13-2 C++常用的四个类对象
名称
|
说 明
|
流 类
|
cin
|
代表标准输入设备(键盘),又叫标准输入流或cin流。
|
istream
|
cout
|
代表标准输出设备(显示器),又叫标准输出流或cout流。
|
ostream
|
cerr
|
错误信息输出设备(显示器),非缓冲输出。
|
clog
|
错误信息输出设备(显示器),缓冲输出。
|
【例13-1-1】 下边的代码用到标准I/O的实现。
源代码:
/* 例13-1-1,13-1-1.cpp */
#include<iostream>
using namespace std;
void main()
{
int a, b, c;
cout << "input a="; //标准输出流(数据从输出流流向标准输出设备)
cin >> a; //标准输入流(数据从标准输入设备流向输入流)
cout << "input b="; //标准输出流(数据从输出流流向标准输出设备)
cin >> b; //标准输入流(数据从标准输入设备流向输入流)
c = a + b;
cout << "c=" << c << endl; //标准输出流(数据从输出流流向标准输出设备)
}
例文件I/O的实现
【例13-1-2】 标准I/O的实现。
源代码:
/* 例13-1-2,13-1-2.cpp */
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
void main()
{
char* s="This is a file.";
ofstream my_ofstream("code.dat"); //定义一个输出文件流对象
my_ofstream.write(s,strlen(s)); //调用该输出文件流对象的write()操作
my_ofstream.close(); //关闭输出文件流对象
ifstream my_ifstream("code.dat"); //定义一个输入文件流对象
char ch;
while(my_ifstream.get(ch)) //循环把文件中所有字符读入输入文件流对象
{
cout<<ch;
}
my_ifstream.close(); //关闭输入文件流对象
}