流缓冲是什么意思?

mag*_*vip 3 c buffer stream

我开始学习C编程,所以我是初学者,在学习标准文本流时,我想出了"stdout"流缓冲而"stderr"流没有缓冲,但是我无法制作用这条线感觉.

我已经在这个论坛上读到了关于"缓冲区"的内容,我喜欢糖果类比,但是当我说:" 这个流是缓冲的而另一个不是缓冲的时候,我无法弄清楚是什么意思. "有什么影响?

有什么不同?

更新:它是否会影响处理速度?

aja*_*jay 6

缓冲区是属于流的内存块,用于临时保存流数据.当在文件上发生第一次I/O操作时,malloc调用并获得缓冲区.写入流的字符通常在缓冲区中累积(在以块的形式传输到文件之前),而不是在应用程序输出后立即出现.类似地,流以块为单位而不是逐个字符地从主机环境检索输入.这样做是为了提高效率,因为与内存操作相比,文件和控制台I/O速度较慢.

GCC提供三种类型的缓冲 - 无缓冲,块缓冲和行缓冲.无缓冲意味着一旦写入(对于输出流)字符就出现在目标文件上,或者逐个字符地从文件读取输入而不是读取块(对于输入流).块缓冲意味着字符被保存在缓冲区中并作为块写入或读取.行缓冲意味着只有在缓冲区中写入或读取换行符之前才会保存字符. stdinstdout被块缓冲当且仅当它们可被确定为不参照其他交互设备它们行缓冲(这是任何流的真).stderr默认情况下始终是无缓冲的.

标准库提供了更改流的默认行为的函数.您可以使用fflush强制数据输出流缓冲区(fflush输入流未定义).您可以使用该setbuf功能使流无缓冲.


The*_*aul 3

缓冲是在写入之前收集许多元素,或者在处理它们之前一次读取许多元素。网上有很多信息,比如这个

和其他像这样的问题

编辑回应问题更新:是的,这是出于性能原因而完成的。对于大多数设备来说,从磁盘等写入和读取在任何情况下都会写入或读取某种“块”,并且这样做会产生相当大的开销。因此,批处理这些操作可以带来巨大的性能差异