输入输出功能并非 C++ 核心语言的一部分,而是由 C++ 标准库提供(因而位于 std
命名空间)。在之前的课程中,你已包含 <iostream>
头文件,并借助 cin
与 cout
对象完成简单 I/O。本节将更深入地探讨 <iostream>
库。
iostream 库
当你包含 <iostream>
头文件后,即可获得一整套负责 I/O 功能的类层次结构(其中有一个类确实就叫 iostream
)。此处可查看不含文件 I/O 的类层次图。
你首先会注意到,该层次结构采用了多重继承(我们曾告诫“如非必要,应尽量避免多重继承”)。然而,<iostream>
库经过精心设计与大量测试,已规避了典型多重继承问题,因此可放心使用。
流(Streams)
其次,你会注意到“流”一词频频出现。抽象地说,C++ 的 I/O 就是基于“流”实现的。一个流本质上是一个可按顺序访问的字节序列;随着时间推移,流可以产生或消耗几乎无限的数据。
我们通常处理两类流:
- 输入流:用于保存来自数据生产者(键盘、文件、网络等)的输入。例如,当用户按下一个键,而程序当前并未等待输入,该按键数据并不会被忽略,而是被放入输入流,等待程序就绪后读取。
- 输出流:用于保存要发送到数据消费者(显示器、文件、打印机等)的输出。当向输出设备写数据时,设备可能尚未就绪(如打印机仍在预热),数据将暂存于输出流,直到设备开始消费。
有些设备(如文件、网络)既可作为输入源,也可作为输出目标。
流的优点在于:程序员只需学会与流交互,即可向多种设备读写数据;流与实际设备如何衔接的细节交由环境或操作系统处理。
C++ 中的输入输出
ios
是std::basic_ios<char>
的别名,定义了输入输出流共有的众多功能,后续课程再述。istream
类是处理输入流的主类。对输入流使用提取运算符 (>>
) 从流中取出值:用户按键后,键码进入输入流,程序再用提取运算符取出。ostream
类是处理输出流的主类。对输出流使用插入运算符 (<<
) 向流中放入值:你将值插入流,数据消费者(如显示器)再取走。iostream
类可同时处理输入与输出,实现双向 I/O。
C++ 标准流
标准流是环境预先为程序连接好的流。C++ 提供四个预定义的标准流对象:
cin
—— 与标准输入(通常指键盘)绑定的istream
对象cout
—— 与标准输出(通常指显示器)绑定的ostream
对象cerr
—— 与标准错误(通常指显示器)绑定的ostream
对象,输出无缓冲clog
—— 与标准错误(通常指显示器)绑定的ostream
对象,输出有缓冲
无缓冲输出通常立即处理,而有缓冲输出通常先暂存,再整块写出。由于 clog
很少使用,常被忽略。
在后续课程中,我们将更深入地探讨更多 I/O 相关功能。