std::setbuf

< 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, NULL, _IONBF, 0) ,这会关闭缓冲。

参数

stream - 要设置缓冲区的文件流
buffer - 指向文件流所用的缓冲区的指针。若提供空指针,则关闭缓冲。若它非空,则数组必须足以保有至少 BUFSIZ 个字符

返回值

(无)

注解

BUFSIZ 不是适合的缓冲区大小,则能用 std::setvbuf 更改它。

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

此函数仅可在已将 stream 关联到打开的文件后,但要在任何其他操作(除了对 std::setbuf/std::setvbuf 的失败调用)前使用。

一个常见错误是设置 stdin 或 stdout 的缓冲区为生存期在程序终止前结束的数组:

int main() {
    char buf[BUFSIZ];
    std::setbuf(stdin, buf);
} // buf 的生存期结束,未定义行为

示例

setbuf 可用于禁用要求立即输出的流上的缓冲

#include <cstdio>
#include <thread>
#include <chrono>
 
int main()
{
    using namespace std::chrono_literals;
 
    std::setbuf(stdout, NULL); // 无缓冲的 stdout
    std::putchar('a'); // 在无缓冲的流上立即显现
    std::this_thread::sleep_for(1s);
    std::putchar('b');
}

输出:

ab

参阅

为文件流设置缓冲区与其大小
(函数)