【问题标题】:C++-What is the need of both buffer and stream?C++-缓冲区和流都需要什么?
【发布时间】:2015-11-23 15:20:56
【问题描述】:

虽然我已经阅读了有关缓冲区和流的信息,并且它正在处理 c++ 中的文件,但我不知道如果存在流,缓冲区需要什么,流总是在那里将一个文件的数据传输到程序。那么为什么我们使用缓冲区来存储数据(执行与流相同的任务)以及什么是缓冲流和非缓冲流。

【问题讨论】:

标签: c++ stream


【解决方案1】:

好的,假设您要处理文件,让我们从头开始。为此,您必须管理数据如何输入到文件中,以及将数据发送到文件中是否成功,以及所有其他基本工作问题。现在,要么您可以自己管理所有这些,这将花费大量时间和艰苦的工作,要么您可以做的是您可以使用流。

是的,您可以为此目的分配流。流与抽象机制一起工作,即我们 C++ 程序员不知道它们是如何工作的,但我们只知道我们在流的一侧(在我们的程序一侧)我们将数据提供给流,它有责任将数据从一端传输到另一端(文件端)

例如-

ofstream file("abc.txt"); //Here an object of output file stream is created
file<<"Hello";            //We are just giving our data to stream and it transfers that
file.close();             //The closing of file

现在,如果您处理文件,您应该知道处理文件是一项非常昂贵的操作,即访问文件比访问内存需要更多时间,而且我们也不必每次都执行文件操作。所以程序员创造了一个新的功能叫做缓冲区,它是计算机内存的一部分,用于临时存储数据以处理文件。

假设在每次读取文件的地方读取数据,您只是读取一些内存位置,文件的所有数据都被临时复制。现在这将是一项成本较低的任务,因为您读取的是内存而不是文件。

那些具有工作缓冲区的流,即打开文件并默认将文件的所有数据复制到缓冲区的流称为缓冲流,而那些不使用任何缓冲区的流称为非缓冲流。

现在,如果您将数据输入到缓冲流中,那么该数据将排队,直到流未被刷新(刷新意味着将缓冲区的数据替换为文件的数据)。无缓冲流的工作速度更快(从用户在流的一端),因为数据不会临时存储到缓冲区中,而是在到达流时发送到文件。

【讨论】:

  • 哇,你的回答真的很长,虽然它帮助我消除了我对文件处理的误解,谢谢
【解决方案2】:

考虑一个写入文件的流。如果没有缓冲区,如果您的程序将单个字节写入流,则您必须将单个字节写入文件。这是非常低效的。因此,流具有缓冲区,可以将流一侧的操作与流另一侧的操作分离。

【讨论】:

    【解决方案3】:

    缓冲区和流是不同的概念。

    缓冲区是内存的一部分,用于临时存储数据。它可以以各种方式实现和构建。例如,如果要读取一个非常大的文件,可以读取文件的大块并将其存储在缓冲区中。一旦处理了某个块,就可以丢弃数据并读取下一个块。在这种情况下,块可能是文件的一行。

    流是 C++ 处理输入和输出的方式。他们的实现使用缓冲区。

    【讨论】:

      【解决方案4】:

      我同意流可能是标准库中写得最差,也是最糟糕的部分。人们每天都在使用它,其中许多人根本不知道他们使用的结构是如何工作的。如果想找点乐子,请尝试询问周围的 std::endl 是什么 - 您可能会发现有些答案很有趣。

      无论如何,streams 和 streambufs 有不同的职责。流应该提供格式化的输入和输出——也就是说,将整数转换为字节序列(或相反),缓冲区负责将字节序列传送到媒体。

      很遗憾,这种设计从实现上看并不清晰。例如,我们有所有这些大量的流——例如文件流和字符串流——而它们之间的唯一区别是缓冲区。流代码保持完全相同。我相信,如果他们愿意的话,很多人会重新设计流,但恐怕这不会发生。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-14
        • 2011-11-14
        • 2019-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多