【问题标题】:setbuf() - printf(), and write()setbuf() - printf() 和 write()
【发布时间】:2018-09-03 15:28:01
【问题描述】:

这是我在 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;
}

输出是

缓冲区内容:
这行得通

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

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

【问题讨论】:

  • write 函数完全绕过缓冲的标准 I/O 系统。
  • 如您所说:write 不是标准的 C 函数。 setbuf 是。

标签: c stream buffer file-descriptor


【解决方案1】:

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

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

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

【讨论】:

  • 您可以提到 POSIX fileno(),它可以干净地获取文件流的文件描述符。
  • 好的,谢谢您的解释!我不知道 setbuf() 与 stdio 缓冲区一起使用。我以为是文件描述符
猜你喜欢
  • 2014-01-31
  • 2018-06-16
  • 2013-01-16
  • 2017-04-28
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多