一.緩衝區顧名思義即爲:內存中開闢的一片緩衝區域
按類型分爲:全緩衝,行緩衝,不帶緩衝
能夠經過標準庫函數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設置全緩衝。
全緩衝的典型就是對磁盤文件的讀寫。
緩衝區爲空,一次讀滿數據,再寫出。linux
windows下測試代碼1:windows
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操做。
典型表明就是鍵盤輸入數據,每次讀取一行。spa
windows下測試代碼1:code
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 }
測試結果:不會直接打印出來,會輸入緩衝區blog
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 }
測試結果:能夠看出設置行緩衝就是設置全緩衝,遇到換行符也不會輸出。get
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後面的輸入被丟掉了