什么是流?

问题描述 投票:13回答:4

当我的书说:流是从设备读取或写入的一系列字符然后我的书说:istreamostream类型代表输入和输出流(它是什么意思?)coutcin究竟是如何工作的?

我不是一个本地语言,当我的书说:输出操作员在给定的ostream上写入给定值时,我无法理解。

c++ c++11 iostream
4个回答
14
投票

“流”隐喻背后的基本思想是它以单通方式提供或消费数据:例如,对于输入流,数据只产生一次。您可以向流请求更多数据,一旦流向您提供数据,它将永远不会再次为您提供相同的数据。

这就是为什么为了对流做任何有意义的事情,你通常会想要将一种缓冲区(一个“流缓冲区”,如果你愿意的话)附加到流中,该流存储一些(通常很小的)已提取的数据量来自流中的随机访问,可检查和可处理的内存。 (输出流有类似的,相反的想法。)

偶尔在没有任何缓冲的情况下处理流是有意义的。例如,如果您有输入和输出流,并且从输入读取整数并将每个整数的doubled值写入输出,则可以在不进行缓冲的情况下执行此操作。

因此,在考虑数据范围时,流是您只能遍历一次且永远不会再遍历的事物。如果您正在考虑前进进度,那么流有另一个属性,即它们可能会阻塞:输入流可能在没有数据时阻塞,输出流可能在无法接受更多数据时阻塞。这样,从程序逻辑中,你可以想象输入流总是包含数据,直到达到它的结束,但是依赖于它的程序可以运行任意的,无限制的挂钟时间。


5
投票

您可以用简单的单词定义它作为数据流,可以是输入流和输出流。因此,您可以将其视为从程序到文件的数据流,反之亦然。下图可以帮助您更好地理解它:

来自MSDN

流是iostream类的核心概念。您可以将流对象视为智能文件,充当字节的源和目标。流的特征由其类和定制的插入和提取操作符确定。


2
投票

从语言的角度来看,流只是具有特定流类接口的对象:它们允许您从中提取数据(输入流)或将数据推入其中(输出流)。输入流不允许随机访问(无论可能意味着什么)它们提供的数据(无论可能是什么)。

请注意,这纯粹是一个类的接口描述,仅此而已。如果流从其中获取数据/将数据推入其中,则完全取决于流。流是接收/发送数据的抽象。

流的具体实现可以从终端应用程序读取数据并将其呈现给程序(cin),另一个可以在程序请求时返回字符到终端应用程序(cout),第三个可以从/读取/写入数据。对于文件(fstreams),第四个可以从/向存储缓冲器(stringstream)读/写数据,第五个可以从随机数发生器“读取”数据,等等。可能性很多,已创建的流接口的不同实现也是如此。

这就是流抽象的美妙之处:它是一种非常灵活的方式,可以让一段代码进行通信。除了可以从/向其读取/写入数据之外,该过程不需要知道关于其数据的源/目的地的任何信息。


0
投票

流是IO操作的物理文件(常规文件或设备文件)的逻辑抽象。在Unix中,流是指向glibc中定义的_IO_FILE结构的指针。 OS给出的_IO_FILE结构存储打开文件的属性。应用程序对这些文件属性进行操作(读,写,查找等)以访问文件中的数据。

您可以在上述流概念之上构建所有类型的流(字符流,字节流,输入流,输出流,甚至双向流)。它们都是上述流的实现或包装器/装饰器。

© www.soinside.com 2019 - 2024. All rights reserved.