C 库函数 - setbuf()
描述
C 库函数 void setbuf(FILE *stream, char *buffer) 定义流 stream 应如何缓冲。该函数应在与流 stream 相关的文件被打开时,且还未发生任何输入或输出操作之前被调用一次。
声明
下面是 setbuf() 函数的声明。
void setbuf(FILE *stream, char *buffer)
参数
- stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了一个打开的流。
- buffer -- 这是分配给用户的缓冲,它的长度至少为 BUFSIZ 字节,BUFSIZ 是一个宏常量,表示数组的长度。
返回值
该函数不返回任何值。
实例1
下面的实例演示了 setbuf() 函数的用法。
/*
* @Author: jinbo.ma
* @Mail: 18710648068@163.com
* @Date: 2021-04-28 16:45:39
* @LastEditTime: 2021-04-28 17:19:36
*/
#include <stdio.h>
int main()
{
/** 前提知识
* stdin 标准输入 文件标识符是 0
* stdout 标准输出 文件标识符是 1
* stderr 标准错误 文件标识符是 2
*/
char buf[BUFSIZ];
printf("BUFSIZ=%d\n", BUFSIZ);
setbuf(stdout, buf);
puts("Test 1!");
puts("Test 2!");
puts("Test 3!"); //puts是行缓冲,自带一个回车符号
printf("--------------"); //printf字符缓冲(自己理解)
sleep(5); //缓冲区不满无法直接输出,可利用下边的函数的fflush刷新输出
fflush(stdout); //BUF缓冲,刷新输出全部buff内的全部内容,使用过后,buf就不在记录新的内容了
fputs(buf, stdout);
return 0;
}
让我们编译并运行上面的程序,这将产生以下结果。在这里,程序在即将输出的时候,发送输出到 STDOUT,否则它将缓冲输出。您也可以使用 fflush() 函数来刷新输出。
BUFSIZ=1024
Test 1!
Test 2!
Test 3!
--------------Test 1!
Test 2!
Test 3!
--------------
实例2 验证缓冲区充满自动输出
#include <stdio.h>
#include <unistd.h>
int main()
{
/** 前提知识
* stdin 标准输入 文件标识符是 0
* stdout 标准输出 文件标识符是 1
* stderr 标准错误 文件标识符是 2
*/
char buf[BUFSIZ];
printf("BUFSIZ=%d\n", BUFSIZ);
setbuf(stdout, buf);
// 1024/4=256
for (int i = 0; i < 256; i++) {
printf("Test");
}
printf("\n"); //1025 此句是关键,超过1024之后是立刻输出,没有超过1024(包含1024)都不会立刻输出
sleep(5);
return 0;
}
最终输出结果一致,请亲自观察输出过程,会发现
- 注释关键句 执行结果如下:会在5秒后输出全部内容,因为程序结束了,不能再继续占用输出资源了,且输出的最后可能会有些看不懂的字符
BUFSIZ=1024
TestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTest0.��
- 打开注释句 执行结果如下:会立刻输出这1025个字符,5秒后结束程序
BUFSIZ=1024 TestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTest