1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          C的全緩沖、行緩沖和無緩沖

          來源:互聯網轉載 時間:2024-01-29 07:48:26

          1.簡介

          基于流的操作最終會調用read或者write函數進行I/O操作。為了使程序的運行效率最高,流對象通常會提供緩沖區,以減少調用系統I/O庫函數的次數。

          在Linux中,緩沖方式存在三種,分別是: (1)全緩沖。輸入或輸出緩沖區被填滿,會進行實際I/O操作。其他情況,如強制刷新、進程結束也會進行實際I/O操作。

          對于讀操作來說,當讀入內容的字節數等于緩沖區大小或者文件已經到達結尾,或者強制刷新,會進行實際的I/O操作,將外存文件內容讀入緩沖區;對于寫操作來說,當緩沖區被填滿或者強制刷新,會進行實際的I/O操作,緩沖區內容寫到外存文件中。磁盤文件操作通常是全緩沖的。

          (2)行緩沖。輸入或輸出緩沖區遇到換行符會進行實際I/O操作。其他與全緩沖相同。

          (3)無緩沖。沒有緩沖區,數據會立即讀入內存或者輸出到外存文件和設備上。標準錯誤輸出stderr是無緩沖的,這樣保證錯誤信息能夠及時反饋給用戶,供用戶排除錯誤。

          三種緩沖類型的宏定義在頭文件<stdio.h>。

          緩沖類型

          全緩沖

          _IOFBF

          行緩沖

          _IOLBF

          無緩沖

          _IONBF

          在學習APUE這本書時,程序8-1中,就很好的體現了全緩沖和行緩沖的區別,代碼如下:

          #include <stdio.h>#include <stdlib.h>int glob=6; int main(int argc, char** argv) {    int var;      pid_t pid;      printf("a write to stdoutn");      if(pid=fork()<0){          printf("fork error");      }else{          if(pid==0){              glob++;              var++;          }          else{              sleep(2);          }      }      printf("pid=%d,glob=%d,var=%dn",getpid(),glob,var);      exit(0);  }

          編譯成功后,我這里生成的二進制文件默認為a.out,運行結果如下:

          ./a.out a write to stdoutpid=4823,glob=7,var=4195873pid=4824,glob=7,var=4195873./a.out > temp.txtcat temp.txta write to stdoutpid=4864,glob=7,var=4195873a write to stdoutpid=4865,glob=7,var=4195873

          可見printf在輸出到標準輸出(顯示器)時,是行緩沖,遇到換行符時會將緩沖區內容輸出到顯示器,并清空緩沖區。當使用重定向命令時,標準輸出被重定向到磁盤文件,此時標準輸出變成全緩沖,遇到換行符不輸出,而是被拷貝至子進程中,在父子進程結束后,各有一份輸出。

          2.緩沖區的設置

          (1)設置是否開啟緩沖區,可使用函數setbuf或者setbuffer。setbuf和setbuffer函數具有打開和關閉緩沖機制。為了帶緩沖進行I/O,參數buf指向緩沖區。通常在此之后該流就是全緩沖的,但是如果該流與一個終端設備相關,那么某些系統也可以將其設置為行緩沖。為了關閉緩沖,可以將buf參數設置為NULL。注意,setbuffer()非C標準庫函數,見于BSD系統。

          setbuf()的緩沖區長度必須為BUFSIZ(定義在stdio.h),否則可能會出現緩沖區溢出。setbuffer可以指定緩沖區大小。

          //@header:stdio.h//@brief:設置指定的緩沖區或關閉緩沖//@param:stream:文件指針;buffer:緩沖區地址//@notice:使用默認緩沖大小BUFSIZ(在stdio.h中定義)void setbuf ( FILE * stream, char * buffer );//@notice:同setbuf,但可指定緩沖區大小void setbuffer(FILE *stream, char *buf, size_t size);

          將buffer指定為NULL,關閉標準輸出緩沖。

          setbuf(stdout,NULL)

          指定新的緩沖區。

          static char newBuffer[BUFSIZ];//必須是BUFSIZ(定義在stdio.h),否則存在緩沖溢出可能setbuf(stdout,(char*)&newBuffer);//或者指定緩沖區大小static char newBuffer[512];setbuffer(stdout,(char*)&newBuffer,512);

          (2)更改緩沖模式,可使用函數setvbuf。

          //@header:stdio.h//@brief:更改緩沖模式并設置緩沖區//@param:stream:文件指針;buf緩沖區地址;type:緩沖區模式;size:緩沖區大小//@ret:0成功,非0失敗int setvbuf(FILE *stream, char *buf, int type, unsigned size);

          例如,將流緩沖區設置為行緩沖,調用setvbuf時,緩沖區地址設為NULL,緩沖區大小設為0。注意,前提是存在緩沖區。

          setvbuf(stream,NULL,_IOLBF,0);  //實測,VS2015中,size需要大于0,且只能設為全緩沖//上面的代碼等價于setlinebuf(stream);             //for BSD

          如果調用setvbuf指定了緩沖區大小size大于0,緩沖區buf為NULL,則交由setvbuf進行malloc申請緩沖區。

          //間接申請1024字節全緩沖區setvbuf ( stream , NULL , _IOFBF , 1024); //實測Linux無效,VS2015可以設置緩沖區大小//以下在Windows和Linux均有有效,顯示指明全緩沖區static char buf[1024];setvbuf ( stream , buff, _IOFBF , 1024);

          對于上面的函數,Linux和Windows平臺對setvbuf()的具體實現不盡相同,使用時也請大家注意,總結為以下幾點: (1)Linux平臺對設備文件默認開啟行緩沖,對磁盤文件默認開啟全緩沖。

          開啟關閉緩沖用setbuf()。在存在緩沖區的前提下,改變緩沖模式用setvbuf()。注意,不能使用setvbuf()來間接申請緩沖區,只能顯示指明緩沖區。

          //不存在緩沖區時,間接申請緩沖區無效setvbuf(stdout,NULL,_IOFBF,100);//可以顯示指明緩沖區static char buf[100];setvbuf(stdout, buf,_IOFBF,100);

          (2)Windows默認關閉緩沖,只能開啟全緩沖,開啟方式如下:

          static char buf[100];setbuf(stdout,buf);  //不安全,不建議使用setvbuf(stdout, buf,_IOFBF,100);//間接申請緩沖區setvbuf(stdout,NULL,_IOFBF,100);

          參考資料

          [1]setvbuf

          標簽:無緩沖-

          網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...

          在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...

          在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...

          9mt柴油發動機性能怎么樣?發動機本身“超級動力”、“完美省油”、“完美聲音調節”、“非常非常穩定”四大特點??癖┰诜置胫g,省油在毫厘之中。9MT發動機原型為雷諾YS23DDT,是雷諾集團面向聯盟全球車型的第2代重型柴油動力,從產品性能、開發質量、零部件質量、能制造質量詳細不能執行雷諾日產聯盟標準。越級動力,如此一來頂級工程師的親自炒調校,9MT最大功率達120kW(應該是162馬力),最高扭矩...

          炫舞新號可以送多少東西?1 .注冊你的炫舞賬號,送炫舞套裝,裝扮你的炫舞人生。(一套7天套裝)2.5級給新手上路的徽章,還有專門的筆記輸入設備和精準的飲料幫助你完成升級任務。3.恭喜你達到8級,戴上華麗的珍貴戒指,送一束花給你的朋友,在競技場pk,這些都是免費的。4.12級可以獲得價值20的炫舞券。你可以選擇YY和道具!(2000分卷)5.15級不僅可以獲得見習舞者徽章,還可以獲得巫師 寶石和競技...

          炫彩寶石如何鑲嵌?QQ炫舞七彩寶石,使用方法如下:1.七彩寶石是增加七彩值,讓游戲角色進場的道具。打開【背包】,點擊道路工具中的寶石,右鍵升級寶石。五個可以升級一次(需要碰運氣),等級越高,獲得入門動作的幾率越高。2、可以在商城買,集券買,不能用券;還可以為音樂盒,每天50的活動,可能送5到100。3.找到一個可以鑲嵌寶石的物品,右擊該物品,選擇鑲嵌/移除寶石,點擊七彩寶石下的鑲嵌。效果如下:QQ...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>