setbuf()-printf()和write()

时间:2018-09-03 15:28:01

标签: c stream buffer file-descriptor

这是我进行Stackoverflow的第一步!

因此,我正在尝试使用setbuf()stdout重定向到char 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;
}

输出为

  

缓冲区内容:
  可行

你知道为什么吗? 因为目前为止我还不知道它是如何工作的,所以我将把stdout传递给stdin,然后读取结果-我认为这不是最干净的方法。

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

1 个答案:

答案 0 :(得分:4)

write函数是一个低级POSIX函数,其操作级别低于C标准输出函数。

直接使用3,14可以绕过stdio缓冲。如果要使用缓冲区,请使用标准的C fwrite函数。

还要注意,writestdout,而FILE*是不透明的数据结构。您永远不要尝试直接使用它的成员。