【问题标题】:Relationship between stream and buffer?流和缓冲区之间的关系?
【发布时间】:2019-10-14 15:00:48
【问题描述】:

我是一个新手程序员,你能帮我想象一下流是什么,它是一个固定的字节数组,用于将数据从文件传输到 Y 吗?这里的 Y 是什么,是缓冲区还是别的什么? 缓冲区与流有什么关系?

【问题讨论】:

  • 另外,我没有投票结束这个过于广泛的问题,因为我不认为这是一个广泛的问题。它有一个简洁、准确的答案。
  • “流”一词用于各种事物,其中一些列在this wikipedia article中。
  • @user3386109:很容易想象 OP 所说的“流”是什么意思,尤其是与“缓冲区”相关的,以及在c 标签下。
  • @Amadan 是的,你读过这篇文章吗?它列出了 “什么是流” 的几个示例,这是 OP 所要求的。

标签: c


【解决方案1】:

流是数据的源(输入流)或接收器(输出流),可及时(或提供)(而不是一次性)。

缓冲区是一个数组(一块内存),用于临时存储数据。输入缓冲区通常由操作系统从输入流中填充;一个输出缓冲区(一旦被程序员填满)被操作系统消耗。

想象一下,你想给一个浴缸装满水。您从可以通过水龙头转移的水源开始,例如水箱或公共自来水厂。你在水龙头下放了一个水桶,然后打开它。当桶装满时,你把它倒进浴缸,然后放回水龙头下。你重复这个直到你的浴缸装满为止。

例如,加载文件的工作方式几乎相同。您有一个数据源(磁盘上的文件);您打开一个输入流(一种编程结构,它通常会以磁盘读取它们的速度为您提供数据)。您分配一个缓冲区(一个小内存区域)并告诉系统从流中填充它。当它已满时,您将其附加到为文件内容保留的大块已分配内存中,然后再次填充缓冲区。读取整个文件后,关闭流。

【讨论】:

  • 这么比喻,fflush() 把水从桶里倒到浴缸里?
  • 差不多,但仅限于输出缓冲区。这是一个不完美的类比,但仍然非常接近现实。另请注意,有多种缓冲区 - 有些是您自己创建的,有些在后台并由操作系统使用,有些在硬件中,您无法以编程方式访问它们。但目的始终是一样的——积累滴落的数据,直到进程或设备准备好。
【解决方案2】:

缓冲区和流之间的区别是

是从或向指定源传输信息的数据字节序列。

流入程序的字节序列称为输入流。从程序中流出的一系列字节称为输出流 Stream 的使用使 I/O 机器独立。

缓冲区是存储在内存中的字节序列。

在 C 中,I/O 操作是异步的:你不知道什么时候有数据,也不知道有多少。 所以缓冲区通常用于从流中收集数据(文件、套接字、设备)。当缓冲区已满时,该流的消费者会收到通知,并且可以使用缓冲区中的数据,直到用完为止。然后等待缓冲区再次被填充,然后再使用该数据。这是一个临时存储东西的地方,以减轻输入速度和输出速度之间的差异。当生产者比消费者快时,生产者可以继续将输出存储在缓冲区中。当消费者加速时,它可以从缓冲区中读取。缓冲区位于中间以弥合差距。

您问题中的 Y 可以是文件、套接字或设备(I/O)。

希望这能解决您的问题 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-10
    • 2011-09-13
    • 2016-09-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    相关资源
    最近更新 更多