输入和输出(I/O)流
本节阅读量:输入和输出功能没有定义为核心C++语言的一部分,而是通过C++标准库提供的(因此驻留在std命名空间中)。在之前,我们简单使用过iostream库,并使用cin和cout对象来执行简单的I/O。在本课中,我们将更详细地了解iostream。
iostream库
当您引用iostream头文件时,您可以访问负责提供I/O功能的类的整个层次结构(包括一个实际命名为iostream的class)。您可以在这里找到非文件I/O类的类层次结构图。
关于这个层次结构,您可能会注意到的第一件事是它使用了多重继承(我们告诉您,如果可能的话,应该避免这种情况)。然而,iostream库已经过设计和广泛测试,以避免任何典型的多重继承问题,因此您可以放心地自由使用它。
Streams(流)
你可能会注意到的第二件事是“stream”这个词用得太多了。最基本的是,C++中的I/O是用stream实现的。抽象地说,stream只是可以顺序访问的字节序列。随着时间的推移,stream可能会产生或消费潜在的无限量的数据。
通常我们处理两种不同类型的流。输入流用于保存来自数据生成器的输入,例如键盘、文件或网络。例如,即使当前程序并没有去读取键盘的输入数据,用户仍可以按键盘上的键。这时候不是忽略用户按键,而是将数据放入输入流,在那里它将等待直到程序准备就绪去进行读取。
相反,输出流用于保存特定数据使用者(如显示器、文件或打印机)的输出。当向输出设备写入数据时,设备可能尚未准备好接受该数据——例如,当程序将数据写入其输出流时,打印机可能仍然在预热。数据将暂存于输出流中,直到打印机开始使用它。
一些设备,如文件和网络,能够同时作为输入和输出源。
stream的好处是程序员只需学习如何与流交互,以便向许多不同类型的设备读写数据。关于stream如何与连接到的实际设备交互的详细信息由环境或操作系统决定。
输入/输出
ios是std::basic_ios<char>的typedef,它定义了输入流和输出流都通用的一组内容。我们将在以后的课程中进行研究。
istream类是处理输入流时使用的主类。对于输入流,提取操作符(»)用于从流中获取值。这是有意义的:当用户按下键盘上的键时,按键值被放在输入流中。然后,您的程序从流中提取值,以便可以使用它。
ostream类是处理输出流时使用的主类。对于输出流,插入运算符(«)用于将值放入流中。这也很有意义:您将值插入到流中,数据使用者(例如显示器)使用它们。
iostream类可以处理输入和输出,允许双向I/O。
标准流
标准流是由其环境提供给计算机程序的预连接流。C++附带了四个预定义的标准流对象,这些对象已经设置为供您使用。前三个,您以前见过:
- cin – 绑定到标准输入 (通常是键盘)
- cout – 绑定到标准输出 (通常是显示器)
- cerr – 绑定到标准错误输出 (通常是显示器), 提供无缓冲输出
- clog – 绑定到标准错误输出 (通常是显示器), 提供有缓冲输出
无缓冲输出通常立即处理,而缓冲输出通常攒一次数据作为整体存储和写出。由于clog不经常使用,因此它经常被大部分人忽略。
在下一课中,我们将更详细地了解一些与I/O相关的功能。
