有没有办法弄清楚input
是buffered
或unbuffered
(除了手册页.)?我们不能通过查看函数的名称来弄清楚吗?也为echoing
和nonechoing...
对于快速参考在哪里可以找到它具有细节的清单Buffered
,Unbuffered
,echoing
和nonechoing
投入?
所有 stdio.h
用于从读取功能FILE
可以表现出任何 "缓冲"或"非缓冲"的行为,和任一 "呼应"或"非呼应"的行为.控制这些内容的不是您使用的功能,而是流和/或其底层文件描述符上的设置.
标准库函数setvbuf
可用于启用或禁用C库对输入(和输出)的缓冲.这对操作系统的缓冲没有影响.有三种可能的模式:"完全缓冲"(以大量块读取或写入); "line buffered"(缓冲区直到'\n'
读取或写入字符,但不超过该字符); 和"无缓冲"(所有读写操作立即进入操作系统).
新FILE
对象(包括stdin
和朋友)的默认缓冲是实现定义的.Unixy C库通常将所有FILE
s 默认为完全缓冲,但有两个例外.stderr
默认为无缓冲.对于任何其他FILE
,如果setvbuf
在第一次实际读取或写入时尚未使用它,并且isatty
对于基础文件描述符为真,则FILE
变为行缓冲.
一些C库提供扩展功能,例如__flbf
Linux和Solaris上的朋友,用于读回受控制的一些设置setvbuf
.请记住,如上所述,如果尚未明确设置缓冲模式,则可以在第一次实际读取或写入时进行更改.
如果输入来自文件,setvbuf
则是您拥有的唯一旋钮.如果输入来自某种通信渠道,则可能还有其他旋钮:
在符合POSIX标准的系统上(读取"Windows以外的所有内容"),程序可以请求终端输入的几种不同模式中的任何一种.其中,最重要的区别在于"规范"和"非规范".规范模式的终端表现出缓冲和回声.(此缓冲与C库可能执行的缓冲是分开的,如果setvbuf
尚未用于禁用它.)非规范模式允许您单独切换缓冲和回显.在低级别的POSIX终端接口是广泛的,复杂的,并允许您读取和写入所有这些设置.
如果您认为要将终端设置为非规范模式,那么在针对低级别POSIX API编写一堆代码之前,您应首先考虑该库readline
或ncurses
库是否会让您的生活更轻松.
如果你正在读一根烟斗,那么无论是谁写的,你都会受到怜悯; 你无法控制你得到的块的大小.
如果你正在阅读套接字,你可以通过小心使用来控制你获得的块的大小recvmsg
,但是没有保证.
我不知道它在Windows上是怎么回事.