C++-缓冲区和流的作用是什么?

5

虽然我已经了解了缓冲区和流以及它们在C++文件操作中的工作原理,但我不知道如果有流,缓冲区有什么必要性。流始终可以将一个文件的数据传输到程序中。那么为什么我们使用缓冲区来存储数据(执行与流相同的任务),缓冲流和非缓冲流是什么。


http://www.cprogramming.com/tutorial/c++-iostreams.html - Tim B
4个回答

7
考虑一个向文件写入数据的流。如果没有缓冲区,如果程序将单个字节写入流中,就必须将单个字节写入文件。这非常低效。因此,流具有缓冲区,以将在流的一侧进行的操作与在流的另一侧进行的操作分离开来。

5
好的,让我们从头开始。假设您想要处理文件。为此,您需要管理数据如何输入到文件中,以及数据是否成功发送到文件中等基本工作问题。现在,您可以自己管理所有这些内容,但这将需要很多时间和辛勤工作,或者您可以使用流。
是的,您可以为此目的分配一个流。流使用抽象机制,即我们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

现在,如果您在处理文件,则应该知道处理文件是一项非常昂贵的操作,即访问文件比访问内存需要更长时间,我们也不必每次执行文件操作。因此,程序员创建了一个名为缓冲区的新功能,它是计算机内存的一部分,并临时存储数据以处理文件。
假设在每次读取数据之前,您只需读取某个内存位置,其中暂时复制了文件的所有数据。现在,它将是一项不那么昂贵的任务,因为您正在读取内存而不是文件。
那些具有缓冲区进行工作的流(即它们打开文件并默认复制文件的所有数据到缓冲区中)称为缓冲流,而那些不使用任何缓冲区的流称为非缓冲流。
现在,如果您向缓冲流输入数据,则该数据将排队等待,直到流被刷新(刷新意味着用文件的数据替换缓冲区的数据)。非缓冲流在工作方面更快(从流的一端用户的角度来看),因为数据不会临时存储到缓冲区中,而是在进入流时立即发送到文件中。

哇,伙计,你的回答真的很长,但它帮助我澄清了关于文件处理的误解,谢谢。 - Sharma

1

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

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

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


1

我同意流(stream)可能是标准库中写得最差、被理解最差的部分。人们每天都在使用它,但很多人对他们使用的构造方式一无所知。为了好玩,试着问一下什么是std::endl,你可能会发现有些答案很有趣。

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

不幸的是,这种设计在实现上并不清晰。例如,我们有所有那些众多的流——例如文件流和字符串流——而这些之间唯一的区别就是缓冲区。流代码保持完全相同。我相信,如果有人有机会重新设计流,许多人会这样做,但恐怕这不会发生。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接