使用setvbuf(),我们可以将流的缓冲区类型更改FILE*为以下之一:
_IONBF(无缓冲)_IOLBF(行缓冲)_IOFBF(完全缓冲)例如,为了设置stderr为行缓冲,我们可以执行以下操作:
setvbuf(stderr, NULL, _IOLBF, 0);
Run Code Online (Sandbox Code Playgroud)
还有一种方法可以找出给定输出流的当前缓冲区类型(使用文件描述符或 FILE 指针)?
这是不可能的。没有标准方法来确定打开的当前缓冲特性FILE。
GNU C 库中提供了 Solaris 引入的非标准函数,GNU C 库中有一个函数__flbf,stdio_ext.h如果流是行缓冲的,则返回非零值。
检查glibc 源libio/iosetvbuf.c后,您不应该使用的以下程序似乎可以在我的 GNU libc 2.31 平台上运行:
#include <stdio.h>
#ifdef __GLIBC__
#define _IO_UNBUFFERED 0x0002
#define _IO_LINE_BUF 0x0200
int getvbuf(FILE *f) {
if (f->_flags & _IO_UNBUFFERED) {
return _IONBF;
} else if (f->_flags & _IO_LINE_BUF) {
return _IOLBF;
}
return _IOFBF;
}
#else
#error This program works only with glibc.
#endif
const char *vbuf_to_str(int a) {
switch (a) {
case _IONBF: return "_IONBF";
case _IOLBF: return "_IOLBF";
case _IOFBF: return "_IOFBF";
}
return "unknown";
}
int main() {
setvbuf(stderr, NULL, _IONBF, 0);
printf("%s\n", vbuf_to_str(getvbuf(stderr)));
setvbuf(stderr, NULL, _IOLBF, 0);
printf("%s\n", vbuf_to_str(getvbuf(stderr)));
setvbuf(stderr, NULL, _IOFBF, 0);
printf("%s\n", vbuf_to_str(getvbuf(stderr)));
}
Run Code Online (Sandbox Code Playgroud)