命名空间
变体
操作

std::setbuf

来自 cppreference.com
< cpp‎ | io‎ | c
 
 
 
 
定义在头文件 <cstdio>
void setbuf( std::FILE* stream, char* buffer );

将内部缓冲区设置为用于对 C 流 stream 执行的 I/O 操作。

如果 buffer 不是空指针,则等效于 std::setvbuf(stream, buffer, _IOFBF, BUFSIZ).

如果 buffer 是空指针,则等效于 std::setvbuf(stream, nullptr, _IONBF, 0),它将关闭缓冲区。

内容

[编辑] 参数

stream - 要设置缓冲区的文件流
buffer - 指向流要使用的缓冲区的指针。如果提供空指针,则关闭缓冲。如果不是空指针,则必须能够容纳至少 BUFSIZ 个字符。

[编辑] 返回值

(无)

[编辑] 注释

如果 BUFSIZ 不是合适的缓冲区大小,则可以使用 std::setvbuf 来更改它。

std::setvbuf 还应该用于检测错误,因为 std::setbuf 不指示成功或失败。

此函数只能在将 stream 与打开的文件关联后使用,但在执行任何其他操作(除了对 std::setbuf/std::setvbuf 的失败调用)之前。

一个常见的错误是将 stdinstdout 的缓冲区设置为一个数组,该数组的生命周期在程序终止之前结束。

int main()
{
    char buf[BUFSIZ];
    std::setbuf(stdin, buf);
} // lifetime of buf ends, undefined behavior

[编辑] 示例

std::setbuf 可用于禁用需要立即输出的流上的缓冲。

#include <chrono>
#include <cstdio>
#include <thread>
 
int main()
{
    using namespace std::chrono_literals;
 
    std::setbuf(stdout, nullptr); // unbuffered stdout
    std::putchar('a'); // appears immediately on unbuffered stream
    std::this_thread::sleep_for(1s);
    std::putchar('b');
}

输出

ab

[编辑] 另请参见

为文件流设置缓冲区及其大小
(function) [编辑]
C 文档 for setbuf