首页 > 解决方案 > setbuf() - printf() 和 write()

问题描述

这是我在 Stackoverflow 上的第一步!

所以,我正在尝试使用setbuf()重定向stdoutchar buffer[BUFSIZ]. 当我使用它时它工作得很好printf(),但当我使用系统调用时它根本不工作write()

这是一个代码示例:

#include <stdio.h>
#include <unistd.h>

int     main(void)
{
    char    buffer[BUFSIZ];

    freopen("/dev/null", "a", stdout);
    setbuf(stdout, buffer);
    printf("This works\n");
    write(stdout->_file, "This doesn't.\n", 14);
    fflush(stdout);
    freopen("/dev/tty", "a", stdout);
    printf("Buffer content :\n%s", buffer);
    return 0;
}

输出是

缓冲区内容:
这有效

你知道为什么吗?因为现在我看不到这是如何工作的,所以我会将标准输出通过管道传输到标准输入,然后读取结果——这不是我认为的最干净的方法。

谢谢你,祝你有美好的一天 !

标签: cstreambufferfile-descriptor

解决方案


write函数是一个低级 POSIX 函数,它在比 C 标准输出函数更低的级别上运行。

通过write直接使用,您可以绕过 stdio 缓冲。如果要使用缓冲区,请改用标准 Cfwrite函数。

还要注意, 和stdout是一个不透明的数据结构。你永远不应该尝试直接使用它的成员。FILE*FILE


推荐阅读