我使用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?
有人可以提出重定向解决方案吗?
答案 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通常使用自己的大小合适的缓冲区,我可以'看看如何提供自己的缓冲区非常有用。
如果你想重定向输出,你应该问一个新的问题,更准确地描述你想要获得的效果。