来源:《C++语言程序设计》
像C语言一样,C++语言也没有输入输出语句。
但C++标准库中有一个面向对象的输入输出软件包,即I/O流类库。
流是I/O流类的中心概念。
------
I/O流类库是C语言中I/O函数在面向对象的程序设计方法中的一个替换产品。
------
在C++中,将数据从一个对象到另外一个对象的流动抽象为"流"。
从流中获取数据的操作称为提取操作
向流中添加数据的操作称为插入操作
数据的输入与输出就是通过I/O流来实现的。
------
当程序与外界环境进行信息交流时,存在着两个对象,一个是程序中的对象,另一个是文件对象。
流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。
------
程序建立一个流对象,并指定这个流对象与某个文件对象建立连接,程序操作流对象,流对象通过文件系统对所连接的文件对象产生作用。
-------
由于流对象是程序中的对象与文件对象进行交互的连接,对程序对象而言,文件对象该有的特性,流对象也有,所以程序将流对象看作是文件对象的化身。
-------
操作系统是将键盘,屏幕,打印机和通信端口作为扩充文件来处理的,而这些处理是通过操作系统的设备驱动程序来实现的。
因此,从C++程序员的角度看,这些设备和磁盘文件是等同的,与这些设备的交互也是通过I/O流类来实现的。
------
在许多操作系统中,输入输出设备如键盘、屏幕、打印机和通信端口等都可以通过文件系统的抽象来访问。
这种抽象使得对这些设备的操作与文件操作非常相似,从而简化了编程模型。
以下是操作系统如何将这些设备视为“文件”来处理的一些具体方式:
键盘:通常被抽象为标准输入设备
在类Unix系统中通常对应于文件/dev/stdin
或/dev/tty
。
在Windows系统中,可以通过CONIN$
来访问。
屏幕:通常被抽象为标准输出设备
在类Unix系统中通常对应于文件/dev/stdout
或/dev/tty
。
在Windows系统中,可以通过CONOUT$
来访问。
---------
在Windows系统中,
CONIN$
和CONOUT$
是特殊的设备名称它们分别用于访问控制台输入(通常是键盘)和控制台输出(通常是屏幕)。
CONIN$
:用于访问控制台输入。在命令行或批处理脚本中,你可以使用CONIN$
来从键盘读取输入。
CONOUT$
:用于访问控制台输出。你可以将输出重定向到CONOUT$
,通常这是默认的控制台输出目的地。例如,在命令提示符(cmd.exe)中,你可以使用以下命令来将键盘输入重定向到一个文件:
这个命令会将你从键盘输入的内容重定向到
input.txt
文件中,直到你按下Ctrl+Z
(在Windows中,Ctrl+Z
表示文件结束符EOF)。
打印机:在类Unix系统中,打印机通常通过特殊的设备文件来访问如/dev/lp0
或/dev/usb/lp0
。
在Windows系统中,打印机通过打印机队列来访问,这些队列可以被看作是特殊的文件。
通信端口:
串行端口(如COM1、COM2等)在类Unix系统中通常表示为设备文件,如/dev/ttyS0
或/dev/ttyUSB0
。
在Windows系统中,它们通过命名管道(如\\.\COM1
)来访问。
---------
流所涉及的范围还远不止于此,凡是数据从一个地方传输到另一个地方的操作都是流的操作。
像网络数据交换,进程数据交换等都是流操作。
流操作也可以针对一个字符串进行。
因此,一般意义上的读操作在流数据抽象中被称为(从流中)提取,写操作被称为(向流中)插入。
---------
I/O流类库的基础是一组类模板,类模板提供了库中的大多数功能,而且可以作用于不同的元素。
流的基本单位除了普通字符(char类型)外,还可以是其他类型(例如wchar_t),流的基本单位的数据类型就是模板的参数。
---------
wchar_t
是 C 和 C++ 编程语言中的一个数据类型,它是 “wide character” 的缩写,用于表示宽字符。宽字符是为了支持国际化和多字节字符集(如 Unicode)而设计的,它能够存储比标准 char
类型更广泛的字符集。
--------
使用I/O流时一般无需直接引用这些模板,因为C++的标准头文件中已经用typedef为这些模板面向char类型的实例定义了别名。
由于模板的实例和类具有相同的性质,可以直接把这些别名看作流类的类名。
--------
为简便起见,把这些别名所表示的模板实例叫类。
在I/O流类库中,头文件iostream声明了4个预定义的流对象,用来完成在标准设备上的输入输出操作:cin,cout,cerr,clog。
---------
I/O流类库中面向char类型的类:
--------
抽象流基类:ios
-------
输入流类:
istream:通用输入流类和其他输入流的基类
ifstream:文件输入流类
istringstream:字符串输入流类
--------
输出流类:
ostream:通用输出流类和其他输出流的基类
ofstream:文件输出流类
ostringstream:字符串输出流类
--------
流缓冲区类:
streambuf:抽象流缓冲区基类
filebuf:磁盘文件的流缓冲区类
stringbuf:字符串的流缓冲区类
-----------------