定义
缓冲区是内存空间的一部分,用于缓冲输入或输出的数据。根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
类型
缓冲区分为三种类型:全缓冲、行缓冲和不带缓冲。
1.全缓冲
在这种情况下,当填满标准I/O缓存后才会进行实际的I/O操作。典型代表是对磁盘文件的读写。
2.行缓冲
输入的字符先放入缓冲区,遇到换行符时才进行实际的I/O操作。典型代表是标准输入(stdin)和标准输出(stdout)。
3.不带缓冲
即不进行缓冲,典型代表是stderr,这样可以使得出错信息尽快显示。
大部分系统默认使用下列类型的缓存:标准出错是不带缓存的;涉及终端设备的流是行缓存的;其余为全缓存。
缓冲区的大小
如果用户没有设置缓冲区,系统会默认为标准输入输出设置缓冲区,大小通常为4096字节。这和计算机中的分页机制有关,每个页的大小为4096字节,因此通常情况下,缓冲区的大小会设置为4096字节。
缓冲区的刷新
以下情况会引发缓冲区的刷新:
1.缓冲区满时;
2.行缓冲区遇到换行符;
3.关闭文件;
4.使用特定函数刷新缓冲区。
举例
#include<stdio.h>
#include<Windows.h>
int main() {
printf("hello");
int i = ;
for (; i < ; i++) {
putchar('a');
Sleep();
}
return ;
}
运行该程序,等待10s后,输出helloaaaaaaaaaa。
这是由于键盘输入是标准的行缓冲,只有遇到换行符或者程序结束后才会输出到屏幕上。
#include<stdio.h>
#include<Windows.h>
int main() {
printf("hello");
fflush(stdout);
int i = ;
for (; i < ; i++) {
putchar('a');
Sleep();
}
return ;
}
运行该程序,首先输出hello,等待10s后,继续输出aaaaaaaaaa。
这是由于fflush刷新了缓冲区,所以会首先输出hello。