setbuf重定向

时间:2011-08-16 21:27:33

标签: c redirect buffer stdout

我使用setbuf将stdout重定向到char缓冲区 但是当我想要在stdout中写入新数据时,我会得到一些副作用

如以下代码所述:

#define bufSize  100
int main()
{
    char buf[bufSize];
    setbuf(stdout, buf);
    printf("123");             //123 is written to the buffer

    setbuf(stdout,NULL);       //123 is written to the stdout(unwanted side effect)
    printf("456");             //123456 appears in the stdout
}

我该如何解决这个问题?

关于此的其他问题 - 此代码是否适用于unix / linux / mac os?

有人可以提出重定向解决方案吗?

3 个答案:

答案 0 :(得分:3)

setbuf()函数不会将输出重定向到缓冲区。它只是告诉标准I / O库“使用此缓冲区;不要自己分配”。

你也应该在每个开放的流中使用setbuf()一次(在它打开之后和其他任何事情完成之前),然后单独留下。如果多次使用它,则会进入未定义的行为 - 您所看到的是可接受的,因为所需行为未定义。

C99标准说:

  

§7.19.5.5setbuf函数

     

除了不返回任何值外,setbuf函数等同于setvbuf   函数调用函数_IOFBF和大小BUFSIZ,或者(如果是buf   是一个空指针),模式的值为_IONBF。

     

§7.19.5.6setvbuf函数

     

setvbuf函数只能在stream指向的流之后使用   已经与一个打开的文件相关联,并且在任何其他操作之前(除了   在流上执行对setvbuf的不成功调用。

答案 1 :(得分:2)

我认为你不能将stdout重定向到这样的缓冲区。无论如何,它最终都在stdout。您只需指定一个将由您的流使用的缓冲区。

如果您使用setbuf(stdout, NULL),它将在幕后创建一个新的缓冲区。它将是无缓冲的写作......即不需要刷新。

所以这里没有副作用,只是正常行为。


如果您想重定向stdout,请查看here。前两个答案描述了两种技术。

答案 2 :(得分:1)

setbuf不适用于重定向。除了关闭缓冲之外,它几乎没用,因此所有输出都会立即出现。它也可以用来为stdio提供一个可以用于FILE的不同缓冲区,但它没有义务以任何特定的方式使用它,并且由于stdio通常使用自己的大小合适的缓冲区,我可以'看看如何提供自己的缓冲区非常有用。

如果你想重定向输出,你应该问一个新的问题,更准确地描述你想要获得的效果。