1. 程式人生 > >內存緩沖區解析

內存緩沖區解析

sys com 錯誤信息 set while 通過 數據 mode bsp

一.緩沖區顧名思義即為:內存中開辟的一片緩沖區域
  按類型分為:全緩沖,行緩沖,不帶緩沖
  可以通過標準庫函數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");
}

結果:直接輸出,不帶緩沖區。

技術分享

內存緩沖區解析