当我的书说:流是从设备读取或写入的字符序列然后我的书说:istream
和ostream
类型代表输入和输出流(它是什么意思?)cout
和cin
的工作原理是什么?
我不是一个本地语言,我的书无法理解:输出操作员将给定的值写在给定的ostream
上。
答案 0 :(得分:13)
“流”隐喻背后的基本思想是它以单通方式提供或使用数据:例如,对于输入流,数据精确生成一旦。您可以向流请求更多数据,一旦流向您提供数据,它将永远不会再为您提供相同的数据。
这就是为什么为了对流做任何有意义的事情,你通常会想要将一种缓冲区(一个“流缓冲区”,如果你愿意的话)附加到存储一些流的流(通常很小)在随机访问,可检查和可处理的内存块中从流中提取的数据量。 (输出流有类似的,相反的想法。)
偶尔处理流没有任何缓冲是有意义的。例如,如果您有输入和输出流,并且从输入读取整数并将每个整数的doubled值写入输出,则可以在不缓冲的情况下执行此操作。
因此,在考虑数据的范围时,流是您只能遍历一次且永远不会再遍历的事物。如果您正在考虑前进进度,那么流有另一个属性,即它们可能阻塞:输入流可能在没有数据时阻塞,输出流可能阻塞它不能再接受任何数据了。这样,从程序逻辑中,您可以想象输入流总是包含数据,直到达到它的结束,但是依赖于它的程序可能会运行任意,无限量的挂钟时间。
答案 1 :(得分:4)
您可以用简单的词语将其定义为数据流,可以是输入流和输出流。因此,您可以将其视为从程序到文件的数据流,反之亦然。下图可以帮助您更好地理解它:
来自MSDN
流是iostream类的核心概念。您可以 将流对象视为充当源的智能文件 字节的目的地。流的特征由确定 它的类和定制的插入和提取操作符。
答案 2 :(得分:2)
从语言的角度来看,流只是具有特定流类接口的对象:它们允许您从中提取数据(输入流)或将数据推入其中(输出流)。输入流不允许随机访问(无论可能意味着什么)它们提供的数据(无论可能是什么)。
请注意,这纯粹是一个类的接口描述,仅此而已。如果流从其中获取数据/将数据推入其中,则完全取决于流。流是接收/发送数据的抽象。
流的具体实现可以从终端应用程序读取数据并将其呈现给程序(cin
),另一个可以在程序请求时将字符返回到终端应用程序(cout
) ,第三个可以从/向文件读取/写入数据(fstream
s),第四个可以从/向内存缓冲区(stringstream
)读/写数据,第五个可以从随机数生成器“读取”数据,依此类推。可能性很多,已创建的流接口的不同实现也是如此。
这就是流的抽象之美:它是一种非常灵活的方式来进行一段代码的通信。该过程不需要知道有关其数据的源/目的地的任何信息,除了它可以从/从中读取/写入数据。
答案 3 :(得分:0)
流是用于IO操作的物理文件(常规文件或设备文件)的逻辑抽象。在Unix中,流是glibc中定义的_IO_FILE结构的指针。操作系统提供的_IO_FILE结构存储打开文件的属性。应用程序对这些文件属性进行操作(读取,写入,查找等)以访问文件中的数据。
您可以在上述流概念的基础上构建所有类型的流(char流,字节流,输入流,输出流,甚至双向流)。它们都是上述流的所有实现或包装器/装饰器。