什么叫流?
C++中把数据之间的传输操作称为流,流既可以表示数据从内存传送到某个载体或设备中,即输出流,也可以表示数据从某个载体或设备传送到内存缓冲区变量中,即输入流。
就像水流一样,从一端流向另外一端,是有方向有起点和终点的动态流动的过程。
如何从流中提取和向流中插入数据呢?
运算符 <<和>>的重载
通常我们会将重载<< 和 >> 运算符(overloaded)以用于输入/输出流操作,也就是说,我们之所以能用cout<<、cin>>输出输入就是因为重载了<<和>>运算符。
<<运算符用于输出,即流插入:
<<将右侧的数据发送到左侧的输出流,cout<<"hello"
的意思就是将字符串”hello“插入到输出流cout中,而cout的默认目标是输出到显示器。数据往显示器或者控制器的方向流动。
>>运算符用于输入,即流提取:
>>将左侧的数据发送到右侧的变量中,cin>>num
的意思就是从cin流中提取数据到变量num中,而cin的流
来源默认是键盘。数据从键盘到变量流动。
重定向
重定向通常指的是 改变标准输入、标准输出或标准错误输出流的方向。
理解输出输出重定向
本来cout将数据输出到显示器,此时显示器就是数据的目的地。如果将这个输出的目的地修改为其它外设或文件,我们就把这种 修改输出的方向的行为叫做输出重定向。同理,输入重定向就是修改数据的来源,比如将数据的来源地从键盘修改为某个其它文件。
C++有哪些流类
我们知道C++的cout、cin是通过标准库提供的 <iostream> 头文件中的输入输出流类实现的。也就是说,cout和cin本质上就是某个类的实例化对象。
在cplusplus上我们可以看到
ios_base类
ios_base是所有流类的基类(不仅仅是输入输出流),它定义了流的基本特性和操作,例如条件状态、缓冲区管理等。ios是ios_base的派生类,提供了输入/输出操作,如">>“和”<<"操作符。
ios类
ios是基流类,是所有输入/输出流类的基类。是标准库中定义的一个抽象基类,不能被直接实例化。ios基类为所有流定义了基本的输入/输出操作,例如缓冲区管理、条件状态的处理等。
由于ios是抽象基类,因此不能直接创建ios类型的对象。标准库提供了从ios派生的若干子类,如istream和ostream,用于实现具体的输入/输出功能。
ios类的四个直接派生类:输入流类istream、输出流类ostream、文件流类fstreambase、串流类strstreambase。
istream、ostream类以及iostream库
istream、ostream是分别输入流和输出流,是ios类的派生类。
istream类定义了对设备或者buffer的操作方法,包含read、readsome、>>等读取操作。
ostream类定义了若干输入输出函数,主要用于错误处理、流的刷新以及流输入输出方式的控制。 iostream是C++标准库中的一个联合了istream和ostream类的输入输出流类库。
常用流类列表
上图出自b站《郑莉课堂》