首页 > 解决方案 > 如何检查输出流的缓冲区类型?

问题描述

使用setvbuf(),我们可以将流的缓冲区类型更改FILE*为以下之一:

例如,为了设置stderr为行缓冲,我们可以执行以下操作:

setvbuf(stderr, NULL, _IOLBF, 0);

还有一种方法可以确定给定输出流的当前缓冲区类型(使用文件描述符或 FILE 指针)?

标签: clinux

解决方案


这是不可能的。没有确定打开的当前缓冲特性的标准方法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)));
}

推荐阅读