我开始学习C编程,所以我是初学者,在学习标准文本流的过程中,我想出了" stdout"流被缓冲而#34; stderr" stream没有缓冲,但我无法理解这一行。
我已经读过"缓冲区"在这个论坛上,我喜欢糖果类比,但我无法弄清楚当一个人说:" 这个流是缓冲而另一个不是。"有什么影响?
有什么区别?
更新:是否会影响处理速度?
答案 0 :(得分:6)
Buffer是一个内存块,属于一个流,用于临时保存流数据。在文件上发生第一次I / O操作时,将调用malloc
并获取缓冲区。写入流的字符通常在缓冲区中累积(在以块的形式传输到文件之前),而不是在应用程序输出后立即出现。类似地,流以块为单位而不是逐个字符地从主机环境检索输入。这样做是为了提高效率,因为与内存操作相比,文件和控制台I / O速度较慢。
GCC提供三种类型的缓冲 - 无缓冲,块缓冲和行缓冲。无缓冲意味着一旦写入(对于输出流)字符就出现在目标文件上,或者逐个字符地从文件读取输入而不是读取块(对于输入流)。块缓冲意味着字符被保存在缓冲区中并作为块写入或读取。行缓冲意味着只有在缓冲区中写入或读取换行符之前才会保存字符。
stdin
和stdout
是块缓冲的,当且仅当它们可以被确定为不引用交互式设备时,它们才是行缓冲的(任何流都是如此)。默认情况下,stderr
始终是无缓冲的。
标准库提供了更改流的默认行为的函数。您可以使用fflush
强制数据输出流缓冲区(fflush
未定义输入流)。您可以使用setbuf
函数使流无缓冲。
答案 1 :(得分:2)
缓冲在写入之前收集了许多元素,或者在处理之前一次读取许多元素。互联网上有大量信息,例如this
和其他SO问题,如this
编辑以回应问题更新:是的,出于性能原因,它已完成。在任何情况下,从磁盘等写入和读取都会写入或读取“块”。对于大多数设备而言,某种类型的开销是公平的。因此,对这些操作进行批处理可以产生显着的性能差异
答案 2 :(得分:0)
答案 3 :(得分:0)
写入缓冲输出的程序可以在写入缓冲区所需的时间内执行输出,这通常非常快,与输出设备的速度无关,可能很慢。
使用缓冲输出时,信息是队列,单独的进程处理输出呈现。
使用无缓冲输出,数据直接写入输出设备,因此以设备的速度运行。这对于错误输出很重要,因为如果输出被缓冲,则在缓冲输出进入显示之前进程可能会失败 - 因此程序可能会在没有诊断输出的情况下终止。