章节目录

输入和输出(I/O)流

本节阅读量:

输入和输出功能并没有定义为核心C++语言的一部分,而是由C++标准库提供(因此位于std命名空间中)。此前,我们简单使用过iostream库,并使用cin和cout对象执行简单的I/O。在本课中,我们将更详细地了解iostream。


iostream库

当您包含iostream头文件时,就可以访问负责提供I/O功能的整个类层次结构(包括一个实际命名为iostream的类)。您可以在这里找到非文件I/O类的层次结构图。

关于这个层次结构,您可能首先会注意到它使用了多重继承(我们曾建议您尽可能避免这种情况)。然而,iostream库经过精心设计和广泛测试,已经避免了典型的多重继承问题,因此可以放心使用。


Streams(流)

您可能会注意到的第二件事是“stream”这个词出现得非常频繁。最基本地说,C++中的I/O是用流(stream)实现的。抽象地说,流只是可以顺序访问的字节序列。随着时间推移,流可能会产生或消费潜在的无限量数据。

通常我们会处理两种不同类型的流。输入流用于保存来自数据生成器的输入,例如键盘、文件或网络。例如,即使当前程序并没有读取键盘输入,用户仍然可以按下键盘按键。此时用户按键不会被忽略,而是会被放入输入流中,在那里等待程序准备好后再读取。

相反,输出流用于保存发往特定数据使用者(如显示器、文件或打印机)的输出。当向输出设备写入数据时,设备可能尚未准备好接收该数据——例如,当程序将数据写入输出流时,打印机可能仍在预热。数据会暂存在输出流中,直到打印机开始使用它。

一些设备,如文件和网络,能够同时作为输入和输出源。

流的好处是,程序员只需学习如何与流交互,就可以向许多不同类型的设备读写数据。至于流如何与实际连接的设备交互,则由环境或操作系统决定。


输入/输出

ios是std::basic_ios<char>的typedef,它定义了输入流和输出流通用的一组内容。我们将在后续课程中研究它。

istream类是处理输入流时使用的主要类。对于输入流,提取运算符(»)用于从流中获取值。这是有意义的:当用户按下键盘按键时,按键值会被放入输入流。然后,您的程序从流中提取该值,以便使用它。

ostream类是处理输出流时使用的主要类。对于输出流,插入运算符(«)用于将值放入流中。这也很有意义:您将值插入流中,数据使用者(例如显示器)使用它们。

iostream类可以处理输入和输出,允许双向I/O。


标准流

标准流是由其环境提供给计算机程序的预连接流。C++附带了四个预定义的标准流对象,这些对象已经设置为供您使用。前三个,您以前见过:

  1. cin – 绑定到标准输入 (通常是键盘)
  2. cout – 绑定到标准输出 (通常是显示器)
  3. cerr – 绑定到标准错误输出 (通常是显示器), 提供无缓冲输出
  4. clog – 绑定到标准错误输出 (通常是显示器), 提供有缓冲输出

无缓冲输出通常会立即处理,而缓冲输出通常会先积累一批数据,再作为整体存储和写出。由于clog不常用,因此经常被大多数人忽略。

在下一课中,我们将更详细地了解一些与I/O相关的功能。


27.10 第27章总结

上一节

28.1 使用istream处理输入

下一节