【发布时间】:2015-11-23 15:20:56
【问题描述】:
虽然我已经阅读了有关缓冲区和流的信息,并且它正在处理 c++ 中的文件,但我不知道如果存在流,缓冲区需要什么,流总是在那里将一个文件的数据传输到程序。那么为什么我们使用缓冲区来存储数据(执行与流相同的任务)以及什么是缓冲流和非缓冲流。
【问题讨论】:
虽然我已经阅读了有关缓冲区和流的信息,并且它正在处理 c++ 中的文件,但我不知道如果存在流,缓冲区需要什么,流总是在那里将一个文件的数据传输到程序。那么为什么我们使用缓冲区来存储数据(执行与流相同的任务)以及什么是缓冲流和非缓冲流。
【问题讨论】:
好的,假设您要处理文件,让我们从头开始。为此,您必须管理数据如何输入到文件中,以及将数据发送到文件中是否成功,以及所有其他基本工作问题。现在,要么您可以自己管理所有这些,这将花费大量时间和艰苦的工作,要么您可以做的是您可以使用流。
是的,您可以为此目的分配流。流与抽象机制一起工作,即我们 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
现在,如果您处理文件,您应该知道处理文件是一项非常昂贵的操作,即访问文件比访问内存需要更多时间,而且我们也不必每次都执行文件操作。所以程序员创造了一个新的功能叫做缓冲区,它是计算机内存的一部分,用于临时存储数据以处理文件。
假设在每次读取文件的地方读取数据,您只是读取一些内存位置,文件的所有数据都被临时复制。现在这将是一项成本较低的任务,因为您读取的是内存而不是文件。
那些具有工作缓冲区的流,即打开文件并默认将文件的所有数据复制到缓冲区的流称为缓冲流,而那些不使用任何缓冲区的流称为非缓冲流。
现在,如果您将数据输入到缓冲流中,那么该数据将排队,直到流未被刷新(刷新意味着将缓冲区的数据替换为文件的数据)。无缓冲流的工作速度更快(从用户在流的一端),因为数据不会临时存储到缓冲区中,而是在到达流时发送到文件。
【讨论】:
考虑一个写入文件的流。如果没有缓冲区,如果您的程序将单个字节写入流,则您必须将单个字节写入文件。这是非常低效的。因此,流具有缓冲区,可以将流一侧的操作与流另一侧的操作分离。
【讨论】:
缓冲区和流是不同的概念。
缓冲区是内存的一部分,用于临时存储数据。它可以以各种方式实现和构建。例如,如果要读取一个非常大的文件,可以读取文件的大块并将其存储在缓冲区中。一旦处理了某个块,就可以丢弃数据并读取下一个块。在这种情况下,块可能是文件的一行。
流是 C++ 处理输入和输出的方式。他们的实现使用缓冲区。
【讨论】:
我同意流可能是标准库中写得最差,也是最糟糕的部分。人们每天都在使用它,其中许多人根本不知道他们使用的结构是如何工作的。如果想找点乐子,请尝试询问周围的 std::endl 是什么 - 您可能会发现有些答案很有趣。
无论如何,streams 和 streambufs 有不同的职责。流应该提供格式化的输入和输出——也就是说,将整数转换为字节序列(或相反),缓冲区负责将字节序列传送到媒体。
很遗憾,这种设计从实现上看并不清晰。例如,我们有所有这些大量的流——例如文件流和字符串流——而它们之间的唯一区别是缓冲区。流代码保持完全相同。我相信,如果他们愿意的话,很多人会重新设计流,但恐怕这不会发生。
【讨论】: