c - 如何检查输出流的缓冲区类型?
问题描述
使用setvbuf()
,我们可以将流的缓冲区类型更改FILE*
为以下之一:
_IONBF
(无缓冲)_IOLBF
(行缓冲)_IOFBF
(完全缓冲)
例如,为了设置stderr
为行缓冲,我们可以执行以下操作:
setvbuf(stderr, NULL, _IOLBF, 0);
还有一种方法可以确定给定输出流的当前缓冲区类型(使用文件描述符或 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)));
}
推荐阅读
- django - 在 ListView Django 中添加选项
- c# - System.TypeInitializationException:“DemoProject.TestResources.StaticClassExample”的类型初始化程序引发异常
- authentication - Blazor 身份验证在 Live 中不起作用,但在开发中起作用
- c++ - C++ #define 还是 typedef 和函数?
- c# - 我的 NET Core Web API 控制器上出现“找不到页面”错误
- image - (JFX) 使用静态方法和继承类加载图像时的问题
- javascript - javascript - 获取具有值的最新行
- r - 根据 R 中事件发生的年龄分配值
- youtube-api - 更新时如何设置视频默认语言?
- python - 'InlineResponse2002' 对象不可下标 | 如何操作 API 响应?