有什么方法可以确定输入
是缓冲
还是未缓冲
(手册页除外)?看函数名不就知道了吗?
也用于 echoing
和 nonechoing...
要快速引用,在哪里可以找到包含 Buffered
、Unbuffered
、echoing
和 nonechoing
输入详细信息的列表?
最佳答案
所有 stdio.h
从FILE
中读取的函数可能显示或者“缓冲”或“非缓冲” ”行为,以及“回声”或“非回声”行为。控制这些东西的不是您使用的函数,而是流上的设置和/或其底层文件描述符。
标准库函数
setvbuf
可用于启用或禁用 C 库的输入(和输出)缓冲。这对操作系统的缓冲没有影响。存在三种可能的模式:“完全缓冲”(以大量 block 读取或写入); “行缓冲”(缓冲直到读取或写入'\n'
字符,但不会超出此范围);和“无缓冲”(所有读取和写入立即进入操作系统)。新
FILE
对象(包括stdin
和其他对象)的默认缓冲是实现定义的。 Unixy C 库通常默认所有FILE
为完全缓冲,但有两个异常(exception)。stderr
默认为无缓冲。对于任何其他FILE
,如果在第一次实际读取或写入时尚未使用setvbuf
,并且isatty
对于底层文件描述符为真,则FILE
变为行缓冲。一些 C 库提供扩展函数,例如
__flbf
和 Linux 和 Solaris 上的 friend 一起,回读 一些 由setvbuf
控制的设置。请记住,如上所述,如果未明确设置缓冲模式,它可能会在第一次实际读取或写入时发生变化。
如果输入来自文件,setvbuf
是您唯一拥有的旋钮。如果输入来自某种通信 channel ,则可能还有其他旋钮:
在符合 POSIX 标准的系统(阅读“除 Windows 之外的所有系统”)上,程序可以请求多种不同模式中的任何一种进行终端输入。其中,最重要的区别是 between "canonical" and "noncanonical" .规范模式下的终端同时显示缓冲和回显。 (如果未使用
setvbuf
禁用它,此缓冲与 C 库可能执行的缓冲分开。)非规范模式允许您单独切换缓冲和回显. low-level POSIX terminal interface内容广泛、复杂,并且允许您读取和写入所有这些设置。如果您认为要将终端置于非规范模式,那么在为此针对低级 POSIX API 编写一堆代码之前,您应该首先考虑是否
readline
或ncurses
图书馆会让你的生活更轻松。如果您正在从管道中读取数据,那么您将受制于向其写入数据的任何人;您无法控制获得的 block 的大小。
如果您正在从套接字读取数据,您可能可以通过谨慎使用
recvmsg
来控制您获得的 block 的大小。 ,但没有任何保证。我不知道它在 Windows 上如何。
关于c - C 中的缓冲和非缓冲输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20342772/