23.1 - 输入输出流
Key Takeaway
输入输出并没有被定义为C++语言的核心功能,它是通过C++的标准库提供的(因此位于std命名空间中)。在之前的课程中,我们在代码中包含了iostream
库的头文件并使用了cin
和cout
对象进行简单的输入输出。在本节课中,我们会进一步研究其细节。
iostream
库
当我们包含 iostream
头文件后,你就可以访问提供输入输出功能的全部类了(包括一个称为iostream
的类)。所有非文件IO的类的继承图可以在这里 找到。
关于这个层次结构,您可能注意到的第一件事是它使用了多重继承(这是我们多次提醒你要避免的事情)。但是,iostream
库经过了广泛的设计和测试,以避免任何典型的多重继承问题,因此你可以放心大胆地使用它。
流(Streams)
你可能注意到的第二件事是“流(stream)”这个词被使用得非常频繁。在最基本的情况下,C++中的I/O是通过流实现的。抽象地说,一个流只是一个可以按顺序访问的字节序列。随着时间的推移,流可能产生或消耗无限数量的数据。
通常情况下我们需要处理两种类型的流。输入流用来保存从数据生产者得到的输入,例如键盘、文件或网络。举例来说,用户可以通过按下键盘上的按键来产生输出(即便程序没有要求任何输入),该输入数据并没有被直接忽略,而是被送入了输入流中,它只是在那里等待程序去读取它。
另一方面,输出流用于保存数据消费者需要的数据,例如显示器、文件或打印机。当向输出设备写数据时,该设备可能并没有准备好接收该数据——例如:当数据被写到输出流时,打印机的可能还在准备。数据就会在输出流中等待打印机去消费它。
有些设备,如文件和网络,可以同时作为输入和输出源。
流的好处是,程序员只需学习如何与流交互,以便向许多不同类型的设备读写数据。关于流如何与它们所连接的实际设备进行接口的细节由环境或操作系统决定。
C++中的 Input/output
尽管ios
类通常派生自ios_base
,但ios
通常是你会直接使用的最上层的基类。ios
类定义了一堆对输入和输出流都通用的东西。我们将在以后的课程中使用这些内容。
istream
类是处理输入流时需要用到的主要类。我们可以使用 提取运算符>> 从流中提取值。当用户按键时,对应的数据会被放置在输入流中,此时你的程序可以从流中提取该值以便使用该数据。
ostream
类则是处理输出流的主要类。我们可以使用插入运算符<< 流中插入数据。我们需要将数据插入流中,这样数据消费者(例如显示器)才能访问该数据。
iostream
类可以处理输入和输出,实现双向 I/O.
C++ 中的标准流
标准流是系统环境提供给程序的预先连接好的流。C++有四个预定义的标准流对象,你可以直接使用它们,其中前三个你之前已经见过了:
cin
-- 绑定到标准输入流(例如键盘)的istream
对象;cout
-- 绑定到标准输出流(通常是显示器)的ostream
对象 ;cerr
-- 绑定到标准错误流(通常是显示器)的ostream
对象,提供无缓冲输出;clog
-- 绑定到标准错误流(通常是显示器)的ostream
对象,提供缓冲输出。
无缓冲输出通常立即处理,而缓冲输出通常作为块存储和写入。因为clog不经常使用,所以它经常从标准流列表中被省略。
在下一课中,我们将更详细地了解更多与I/O相关的功能。