setbuf重定向

Yak*_*kov 2 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
}
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

关于此的其他问题 - 这段代码适用于 unix/linux/mac os 吗?

谁能提出重定向的解决方案?

Jon*_*ler 5

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

\n\n

您还应该为setbuf()每个打开的流使用一次(在打开流后立即且在对其执行任何其他操作之前),然后不要打扰。如果多次使用它,您就会陷入未定义的行为 - 并且您看到的内容是可以接受的,因为所需的行为是未定义的。

\n\n

C99标准说:

\n\n
\n

\xc2\xa77.19.5.5 setbuf 函数

\n\n

除了不返回任何值之外,setbuf 函数等效于使用值 _IOFBF 表示模式和使用 BUFSIZ 表示大小,或者(如果 buf\n 是空指针)使用值 _IONBF 表示模式调用的 setvbuf\n 函数。

\n\n

\xc2\xa77.19.5.6 setvbuf 函数

\n\n

仅当流指向的流已与打开的文件关联之后且在流上执行任何其他操作(对 setvbuf 的不成功调用除外)之前,才可以使用 setvbuf 函数。

\n
\n