c - C 中的缓冲和非缓冲输入

标签 c input buffer

有什么方法可以确定输入缓冲还是未缓冲(手册页除外)?看函数名不就知道了吗? 也用于 echoingnonechoing... 要快速引用,在哪里可以找到包含 BufferedUnbufferedechoingnonechoing 输入详细信息的列表?

最佳答案

所有 stdio.hFILE 中读取的函数可能显示或者“缓冲”或“非缓冲” ”行为,以及“回声”或“非回声”行为。控制这些东西的不是您使用的函数,而是流上的设置和/或其底层文件描述符。

  • 标准库函数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 编写一堆代码之前,您应该首先考虑是否 readlinencurses图书馆会让你的生活更轻松。

  • 如果您正在从管道中读取数据,那么您将受制于向其写入数据的任何人;您无法控制获得的 block 的大小。

  • 如果您正在从套接字读取数据,您可能可以通过谨慎使用 recvmsg 来控制您获得的 block 的大小。 ,但没有任何保证。

  • 我不知道它在 Windows 上如何。

关于c - C 中的缓冲和非缓冲输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20342772/

相关文章:

c - 结构函数返回不完整类型

c - GDB 在进入 C 函数时显示不正确的函数参数

javascript - 如何将输入文本字段中的一些文本设为粗体?

c - Linux 中的瞬时键盘状态

file-io - Racket 中的文件输出有最大长度吗?

python - 如何正确地将 Pytube bufferIO 转换为表示正弦波的 numpy 数组?

c++ - ReadProcessMemory 的缓冲区应该是什么数据类型?

c - 有效地找到大数组中的最低有效位?

c++ - 是否应该避免在 C/C++ 中使用递归调用?

javascript - JSONP请求链接到用户输入字段+按钮: only executes once