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

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

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

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

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

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

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

我同意流可能是标准库中写得最差和理解最差的部分。人们每天都在使用它,其中许多人对他们使用的结构如何工作一无所知。想找点乐子,试着问一下 std::endl 周围有什么 - 您可能会发现有些答案很有趣。

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

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

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

是的,您可以为此目的分配流。流与抽象机制一起工作,即我们 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

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

假设在每次读取数据时读取文件的地方你只是读取了一些内存位置,文件的所有数据都被复制了temporarily.Now这将是一个更便宜的任务,因为你正在读取内存而不是文件.

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

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