C++-缓冲区和流的需求是什么

C++-What is the need of both buffer and stream?

本文关键字:需求 是什么 缓冲区 C++-      更新时间:2023-10-16

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

考虑一个写入文件的流。如果没有缓冲区,如果程序向流中写入一个字节,则必须向文件中写入一字节。这是非常低效的。因此,流具有缓冲区,用于将流一侧的操作与流另一侧的操作解耦。

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

是的,您可以为此目的分配流。流使用抽象机制工作,即我们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++处理输入和输出的方式。它们的实现使用缓冲区。

我同意stream可能是标准库中编写最差、udnerstand最差的部分。人们每天都在使用它,他们中的许多人根本不知道他们使用的结构是如何工作的。为了好玩,试着问一下std::endl是什么——你可能会发现有些答案很有趣。

无论如何,stream和streambuf都有不同的责任。流应该提供格式化的输入和输出,也就是说,将整数转换为字节序列(或者反过来),缓冲区负责将字节序列传输到媒体。

不幸的是,这个设计从实现上看并不清楚。例如,我们有许多流,例如文件流和字符串流,而它们之间的唯一区别是缓冲区。流代码保持完全相同。我相信,如果有办法的话,很多人会重新设计流,但我担心,这不会发生。