一.缓冲区顾名思义即为:内存中开辟的一片缓冲区域
按类型分为:全缓冲,行缓冲,不带缓冲
可以通过标准库函数setvbuf(_Inout_ FILE * _File, _Inout_updates_opt_z_(_Size) char * _Buf, _In_ int _Mode, _In_ size_t _Size);来设置缓冲区的类型
1.全缓冲:
当当填满标准IO的缓存后才进行实际IO操作。
windows和linux都可以通过给_Mode设为_IOFBF设置全缓冲。
全缓冲的典型就是对磁盘文件的读写。
缓冲区为空,一次读满数据,再写出。
windows下测试代码1:
1 void main() 2 { 3 char buf[1024];//缓冲区大小为1024 4 setvbuf(stdout, buf, _IOFBF, 1024); 5 printf("中国女排很给力!\n\n"); 6 //while (1) 7 //{ 8 // printf("hello"); 9 10 // Sleep(10); 11 //} 12 //setvbuf(stdout, NULL, _IONBF, 0); 13 system("pause"); 14 }
结果:不会输出
测试代码2:
1 void main() 2 { 3 char buf[1024];//缓冲区大小为1024 4 setvbuf(stdout, buf, _IOFBF, 1024); 5 printf("中国女排很给力!\n\n"); 6 while (1) 7 { 8 printf("hello"); 9 10 Sleep(10); 11 } 12 //setvbuf(stdout, NULL, _IONBF, 0); 13 system("pause"); 14 }
结果:
2.行缓冲:
在输入输出遇到换行符时,执行真正的IO操作。
linux输出默认是行缓冲,以回车结束。windows没有行缓冲,不能设置,一旦设置变为全缓冲。
设置行缓冲为:_IOLBF
这时候输入的字符先存放至缓冲区,等按下回车键时才进行实际IO操作。
典型代表就是键盘输入数据,每次读取一行。
windows下测试代码1:
1 void main() 2 { 3 char buf[4096]; 4 setvbuf(stdout, buf, _IOLBF, 4096); 5 printf("中国女排很给力!"); 6 //while (1) 7 //{ 8 // printf("hello"); 9 //} 10 //setvbuf(stdout, NULL, _IONBF, 0); 11 system("pause"); 12 }
测试结果:不会直接打印出来,会输入缓冲区
windows下测试代码2:
1 void main() 2 { 3 char buf[4096]; 4 setvbuf(stdout, buf, _IOLBF, 4096); 5 printf("中国女排很给力!\n\n"); 6 //while (1) 7 //{ 8 // printf("hello"); 9 //} 10 //setvbuf(stdout, NULL, _IONBF, 0); 11 system("pause"); 12 }
测试结果:可以看出设置行缓冲就是设置全缓冲,遇到换行符也不会输出。
windows下测试代码3:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<windows.h> 4 5 void main() 6 { 7 char buf[1024];//缓冲区大小为1024 8 setvbuf(stdout, buf, _IOLBF, 1024); 9 printf("中国女排很给力!\n\n"); 10 while (1) 11 { 12 printf("hello"); 13 14 Sleep(10); 15 } 16 setvbuf(stdout, NULL, _IONBF, 0); 17 system("pause"); 18 }
测试结果:等缓冲区满后才一次性输出
3.不带缓冲区:
直接进行实际的输入输出操作。
windows默认输出不带缓冲,linux可以设置setvbuf(stdout, NULL, _IONBF, 0);而不带缓冲
典型代表是标准错误stderr,这样可以使错误信息尽快显示出来
windows默认输出测试代码:
#include<stdio.h> #include<stdlib.h> void main() { printf("中国女排很给力!"); //setvbuf(stdout, NULL, _IONBF, 0); system("pause"); }
结果:直接输出,不带缓冲区。
4.缓冲区的刷新
--所谓刷新对输出而言是将缓冲区内容立即输出
windows测试代码:
1 void main() 2 { 3 char buf[1024];//缓冲区大小为1024 4 setvbuf(stdout, buf, _IOFBF, 1024); 5 printf("中国女排很给力!"); 6 fflush(stdout);//刷新屏幕输出缓冲区,使缓冲区的内容输出 7 //while (1) 8 //{ 9 // printf("hello"); 10 11 // Sleep(10); 12 //} 13 //setvbuf(stdout, NULL, _IONBF, 0); 14 system("pause"); 15 }
测试结果:对于满缓冲输出模式,可以立即输出缓存内容
--对输入而言是刷新后面的内容被抛弃
测试代码:
1 void main() 2 { 3 char c = getchar(); 4 printf("%c\n", c); 5 c = getchar(); 6 printf("%c\n", c); 7 fflush(stdin);//刷新屏幕输出缓冲区,使缓冲区的内容输出 8 c = getchar(); 9 printf("%c\n", c); 10 c = getchar(); 11 printf("%c\n", c); 12 13 system("pause"); 14 }
测试结果:可以看到fflush后面的输入被丢掉了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?