內存緩衝區解析

一.緩衝區顧名思義即爲:內存中開闢的一片緩衝區域
  按類型分爲:全緩衝,行緩衝,不帶緩衝
  能夠經過標準庫函數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後面的輸入被丟掉了

相關文章
相關標籤/搜索