一、流类的继承关系

C++语言中,为数据的输入和输出定义了一系列类库,主要包括:

ios,istream,ostream,iostream,ifstream,ofstream,fstream,istrstream,ostrstream,strstream等,其中ios为根基类,其余都是它的直接或间接派生类。其关系如图13-1所示。

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-113-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-213-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();                        //关闭输入文件流对象

}