C++输入输出(IO)流

输入输出功能并非 C++ 核心语言的一部分,而是由 C++ 标准库提供(因而位于 std 命名空间)。在之前的课程中,你已包含 <iostream> 头文件,并借助 cincout 对象完成简单 I/O。本节将更深入地探讨 <iostream> 库。

iostream 库

当你包含 <iostream> 头文件后,即可获得一整套负责 I/O 功能的类层次结构(其中有一个类确实就叫 iostream)。此处可查看不含文件 I/O 的类层次图。

你首先会注意到,该层次结构采用了多重继承(我们曾告诫“如非必要,应尽量避免多重继承”)。然而,<iostream> 库经过精心设计与大量测试,已规避了典型多重继承问题,因此可放心使用。

流(Streams)

其次,你会注意到“流”一词频频出现。抽象地说,C++ 的 I/O 就是基于“流”实现的。一个流本质上是一个可按顺序访问的字节序列;随着时间推移,流可以产生或消耗几乎无限的数据。

我们通常处理两类流:

  • 输入流:用于保存来自数据生产者(键盘、文件、网络等)的输入。例如,当用户按下一个键,而程序当前并未等待输入,该按键数据并不会被忽略,而是被放入输入流,等待程序就绪后读取。
  • 输出流:用于保存要发送到数据消费者(显示器、文件、打印机等)的输出。当向输出设备写数据时,设备可能尚未就绪(如打印机仍在预热),数据将暂存于输出流,直到设备开始消费。

有些设备(如文件、网络)既可作为输入源,也可作为输出目标。

流的优点在于:程序员只需学会与流交互,即可向多种设备读写数据;流与实际设备如何衔接的细节交由环境或操作系统处理。

C++ 中的输入输出

  • iosstd::basic_ios<char> 的别名,定义了输入输出流共有的众多功能,后续课程再述。
  • istream 类是处理输入流的主类。对输入流使用提取运算符 (>>) 从流中取出值:用户按键后,键码进入输入流,程序再用提取运算符取出。
  • ostream 类是处理输出流的主类。对输出流使用插入运算符 (<<) 向流中放入值:你将值插入流,数据消费者(如显示器)再取走。
  • iostream 类可同时处理输入与输出,实现双向 I/O。

C++ 标准流

标准流是环境预先为程序连接好的流。C++ 提供四个预定义的标准流对象:

  • cin —— 与标准输入(通常指键盘)绑定的 istream 对象
  • cout —— 与标准输出(通常指显示器)绑定的 ostream 对象
  • cerr —— 与标准错误(通常指显示器)绑定的 ostream 对象,输出无缓冲
  • clog —— 与标准错误(通常指显示器)绑定的 ostream 对象,输出有缓冲

无缓冲输出通常立即处理,而有缓冲输出通常先暂存,再整块写出。由于 clog 很少使用,常被忽略。

在后续课程中,我们将更深入地探讨更多 I/O 相关功能。

关注公众号,回复"cpp-tutorial"

可领取价值199元的C++学习资料

公众号二维码

扫描上方二维码或搜索"cpp-tutorial"