【问题标题】:What is a stream exactly?究竟什么是流?
【发布时间】:2014-10-28 09:40:20
【问题描述】:

当我的书说:流是从设备读取或写入的字符序列时,我的书说:istreamostream 类型代表输入和输出流(这是什么意思?) coutcin 工作吗?

我不是母语,当我的书说:输出运算符将给定值写入给定的ostream 时,我无法理解。

【问题讨论】:

标签: c++ c++11 iostream


【解决方案1】:

“流”隐喻背后的基本思想是它以单程方式提供或使用数据:例如,对于输入流,数据是精确生成的一次。您可以向流请求更多数据,一旦流为您提供了数据,它就再也不会为您提供相同的数据了。

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

有时在没有任何缓冲的情况下处理流是有意义的。例如,如果您有一个输入和一个输出流,并且您从输入读取整数并将每个整数的加倍值写入输出,则无需缓冲即可。

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

【讨论】:

  • 指出通过 CRT(或现代等价物 (lol))显示的终端历史记录在此上下文中是一个缓冲区。
【解决方案2】:

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

来自MSDN

流是 iostream 类的核心概念。你可以 将流对象视为充当源的智能文件,并且 字节的目的地。流的特征由 它的类和自定义的插入和提取操作符。

【讨论】:

    【解决方案3】:

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

    请注意,这纯粹是一个类的接口描述,仅此而已。流从哪里获取数据/它对推入其中的数据做了什么,完全取决于流。流是接收/发送数据的抽象。

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 这是一个笼统的、相当抽象的问题;小心假设 OP 在什么平台上。
      • I.M.H.O.这正是流如此难以理解的原因——它有很多实现,每个都有自己的定义。所以,我有点退回到一切开始的 K&R C 和 Unix。
      • 您能否通过回答以下问题来消除我对流的疑虑。 1#stream是特定内存区域的名称吗? 2# 或者它像 c++ 之类的普通对象一样工作,我的意思是当我们创建一个与流相关的类(如 istream、ostream、iostream)的对象时,该对象在 ram 中占用内存并执行类主体中给出的任何属性和行为。
      • 基本上,没有操作系统的帮助,用户程序无法访问内存或任何硬件。简而言之,当您运行 C++ 程序时,编译器会将程序转换为本机代码,并且操作系统将在进行配置的运行时加载/链接本机代码(包括您提到的流对象)。我相信用户可以通过多种方式和环境访问“特定内存区域”,但这将是一个漫长的故事。
      猜你喜欢
      • 2012-08-27
      • 2010-11-12
      • 2011-03-18
      • 2011-01-22
      • 1970-01-01
      相关资源
      最近更新 更多