有没有办法弄清楚input
是buffered
还是unbuffered
(手册页除外)?我们不能通过查看函数的名称来弄清楚吗?
也适用于echoing
和nonechoing...
有关快速参考,请在哪里找到包含Buffered
,Unbuffered
,echoing
和nonechoing
输入详细信息的列表?
答案 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
禁用它,则此缓冲与
如果您认为要将终端设置为非规范模式,那么在针对低级别POSIX API编写一堆代码之前,您应首先考虑是否readline
或ncurses
图书馆会让您的生活更轻松。
如果你正在阅读一根烟斗,那么无论是谁写的,你都会摆布;你无法控制你得到的块的大小。
如果您正在阅读套接字,那么可以能够通过谨慎使用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()
相关联。您可以将缓冲模式更改为完整,行或无。