C中的缓冲和非缓冲输入

时间:2013-12-03 04:14:25

标签: c input buffer

有没有办法弄清楚inputbuffered还是unbuffered(手册页除外)?我们不能通过查看函数的名称来弄清楚吗? 也适用于echoingnonechoing... 有关快速参考,请在哪里找到包含BufferedUnbufferedechoingnonechoing输入详细信息的列表?

3 个答案:

答案 0 :(得分:29)

stdio.h读取的所有 FILE函数可能会显示 “缓冲”或“无缓冲”行为,而 “回显”或“不回显”行为。控制这些内容的不是您使用的功能,而是流和/或其底层文件描述符的设置。

  • 标准库函数setvbuf可用于启用或禁用C库对输入(和输出)的缓冲。这对操作系统的缓冲没有影响。有三种可能的模式:“完全缓冲”(以大量块读取或写入); “line buffered”(缓冲区,直到读取或写入'\n'个字符,但不超出此范围);和“无缓冲”(所有读写操作立即进入操作系统)。

  • FILE个对象(包括stdin和朋友)的默认缓冲是实现定义的。 Unixy C库通常将所有FILE默认为完全缓冲,但有两个例外。 stderr默认为无缓冲。对于任何其他FILE,如果在第一次实际读取或写入时尚未使用setvbuf,并且isatty对于基础文件描述符为真,那么{{ 1}}变为行缓冲。

  • 某些C库提供扩展功能,例如__flbf以及Linux和Solaris上的朋友,用于读回由FILE控制的部分设置。请记住,如上所述,缓冲模式可以在第一次实际读取或写入时更改,如果尚未明确设置的话。

如果输入来自文件,则setvbuf是您拥有的唯一旋钮。如果输入来自某种通信渠道,则可能还有其他旋钮:

  • 在符合POSIX标准的系统上(读取“Windows以外的所有内容”),程序可以请求终端输入的几种不同模式中的任何一种。其中,最重要的区别是between "canonical" and "noncanonical"。规范模式的终端表现出缓冲和回声。 (如果未使用setvbuf禁用它,则此缓冲与可以执行的缓冲分开。)非规范模式允许您单独切换缓冲和回显。 low-level POSIX terminal interface广泛,复杂,允许您读取和写入所有这些设置。

  • 如果您认为要将终端设置为非规范模式,那么在针对低级别POSIX API编写一堆代码之前,您应首先考虑是否readlinencurses图书馆会让您的生活更轻松。

  • 如果你正在阅读一根烟斗,那么无论是谁写的,你都会摆布;你无法控制你得到的块的大小。

  • 如果您正在阅读套接字,那么可以能够通过谨慎使用recvmsg来控制您获得的块的大小,但是没有保证。

  • 我不知道它在Windows上是怎么回事。

答案 1 :(得分:4)

ISO / IEC 9899-1999 C99语言标准

5.1.2.3程序执行

...

5)交互设备的输入和输出动态应按照规定进行 7.19.3。这些要求的目的是无缓冲或行缓冲输出 尽快出现,以确保提示消息实际出现在之前 等待输入的程序。 ...

7.19.3档案

...

3)当流是无缓冲的时,字符意图从源或出现 目的地尽快。否则可能会累积字符 作为块传输到主机环境或从主机环境传输。当流完全缓冲时, 字符旨在作为块时传输到主机环境或从主机环境传输 填充缓冲区。当流被线缓冲时,字符应该是 当换行字符时,作为块发送到主机环境或从主机环境发送 遇到。此外,字符旨在作为块传输到主机 填充缓冲区时,在无缓冲流上请求输入时的环境,或 当在需要传输的线路缓冲流上请求输入时 来自主机环境的字符。支持这些特征是 实现定义,可能会受到setbuf和setvbuf函数的影响。 ...

7)在程序启动时,预定义了三个文本流,无需显式打开 - 标准输入(用于读取传统输入),标准输出(用于写入) 常规输出)和标准错误(用于写入诊断输出)。最初 打开后,标准错误流未完全缓冲;标准输入和标准 当且仅当可以确定流不被引用时,输出流被完全缓冲 到交互设备。

答案 2 :(得分:2)

您可以将缓冲区与包含stdin的文件与setvbuf()相关联。您可以将缓冲模式更改为完整,行或无。