title: C++(十一)输入输出流date: 2021-04-29 20:00:08.116

updated: 2021-04-30 17:20:17.157
url: /?p=120
categories: C++
tags: C++

流和流类

C++ 开发者认为数据传输(包含输入和输出)的过程像水一样,从一个地方流到另一个地方,所以称实现输入的为输入流,实现数据输出的为输出流,实现此过程的类称为“流类”

其中,图中的箭头代表各个类之间的派生关系。比如,ios 是所有流类的基类,它派生出 istream 和 ostream。特别需要指出的是,为了避免多继承的二义性,从 ios 派生出 istream 和 ostream 时,均使用了 virtual 关键字(虚继承)。

这些流类各自的功能分别为:

  1. istream:常用于接收从键盘输入的数据;
  2. ostream:常用于将数据输出到屏幕上;
  3. ifstream:用于读取文件中的数据;
  4. ofstream:用于向文件中写入数据;
  5. iostream:继承自 istream 和 ostream 类,因为该类的功能6. 兼两者于一身,既能用于输入,也能用于输出;
  6. fstream:兼 ifstream 和 ofstream 类功能于一身,既能读取文件中的数据,又能向文件中写入数据。

C++ 输入流和输出流

在前面章节的学习中,只要涉及输入或者输出数据,我们立马想到的就是 cin 和 cout。其实,cin 就是 istream 类的对象,cout 是 ostream 类的对象,它们都声明在  头文件中,这也解释了“为什么在 C++ 程序中引入  就可以使用 cin 和 cout”(当然使用 cin 和 cout,还需要声明 std 命名空间)。

除此之外, 头文件中还声明有 2 个 ostream 类对象,分别为 cerr 和 clog。它们的用法和 cout 完全一样,但 cerr 常用来输出警告和错误信息给程序的使用者,clog 常用来输出程序执行过程中的日志信息(此部分信息只有程序开发者看得到,不需要对普通用户公开)。

cout、cerr 和 clog 之间的区别如下:

  1. cout 除了可以将数据输出到屏幕上,通过重定向(后续会讲),还可以实现将数据输出到指定文件中;而 cerr 和 clog 都不支持重定向,它们只能将数据输出到屏幕上;
  2. cout 和 clog 都设有缓冲区,即它们在输出数据时,会先将要数据放到缓冲区,等缓冲区满或者手动换行(使用换行符 ‘\n’ 或者 endl)时,才会将数据全部显示到屏幕上;而 cerr 则不设缓冲区,它会直接将数据输出到屏幕上。

除了以上 2 点特性上的不同之外,cerr、clog 和 cout 没有任何不同。之所以我们常用 cout,是因为 cerr 和 clog 有各自不同的适用场景。以 cerr 为例,一旦程序某处使用 cerr 输出数据,我们自然而然地会认为此处输出的是警告或者错误信息。