溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

有哪些緩沖類型

發(fā)布時間:2021-10-25 10:25:30 來源:億速云 閱讀:141 作者:iii 欄目:web開發(fā)

這篇文章主要介紹“有哪些緩沖類型”,在日常操作中,相信很多人在有哪些緩沖類型問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”有哪些緩沖類型”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

緩沖

為了減少使用read和write調(diào)用的次數(shù),標(biāo)準(zhǔn)IO庫提供了緩沖,有人可能會問,為什么要減少它們的調(diào)用次數(shù)?很明顯read和write是系統(tǒng)調(diào)用,它們花費的時間將會更多,本文不展開描述。那么有哪三種緩沖類型呢?

全緩沖

在全緩沖的情況下,在填滿標(biāo)準(zhǔn)I/O緩沖區(qū)后,才進行實際的I/O操作。寫磁盤文件通常就是全緩沖的。舉個例子:

#include<stdio.h> #include<unistd.h> int main(void) {     /*以可讀可寫的方式打開*/     FILE *fp = fopen("./test.txt","w+");     if(NULL == fp)     {         perror("open file failed");         return -1;     }     /*寫入內(nèi)容*/     char buf[] = "wechat:shouwangxiansheng\n";     fwrite(buf,sizeof(char),sizeof(buf),fp);     //fflush(fp);     /*sleep一段時間,以便觀察*/     sleep(20);     fclose(fp);     return 0; }

打開一個文件,并向里面寫入一段字符串。我們編譯并運行:

$ gcc -o buff buff.c $ cat test.txt wechat:shouwangxiansheng $ ./buff

此時觀察test.txt:

$ cat test.txt

發(fā)現(xiàn)它的內(nèi)容是空!明明已經(jīng)寫入了為什么會什么東西都沒有?原因在于它默認(rèn)是全緩沖的,因此在將內(nèi)容寫入文件后,并沒有直接存在文件中,當(dāng)程序關(guān)閉文件或者程序運行完成退出后,再次查看:

發(fā)現(xiàn)文件已經(jīng)有了內(nèi)容。除了等待程序運行完成,還可以使用fflush函數(shù),它可以將緩沖區(qū)中的內(nèi)容寫入到磁盤中(終端驅(qū)動設(shè)備表示丟棄緩沖區(qū)的數(shù)據(jù))。所以將fwrite下面一行的注釋去掉后,就可以發(fā)現(xiàn),寫入之后,就可以直接在文件中看到內(nèi)容了。所以當(dāng)你在寫一個文件,但是查看文件卻沒有任何寫入內(nèi)容時,不要一直懷疑自己的代碼。

行緩沖

行緩沖指的是當(dāng)遇到換行符時,或者緩沖區(qū)已經(jīng)滿了(一般1024字節(jié)),標(biāo)準(zhǔn)I/O庫執(zhí)行I/O操作。同樣舉個例子:

#include<stdio.h> #include<unistd.h> int main(void) {     printf("wechat:shouwangxiansheng");     sleep(10);     return 0; }

編譯運行上面的程序:

$ gcc -o lineBuff lineBuff.c $ ./lineBuff

你會發(fā)現(xiàn),printf執(zhí)行完了之后,內(nèi)容并沒有馬上輸出到終端,而是在程序運行完之后才輸出。聰明的你當(dāng)然也知道,要想打印完后直接輸出到終端,只需要改成下面這樣就可以了:

printf("wechat:shouwangxiansheng\n");

不帶緩沖

這個從字面就可以理解其意思了。同樣舉個例子:

noBuff.c*/ #include<stdio.h> #include<unistd.h> int main(void) {     fprintf(stderr,"wechat:shouwangxiansheng");     sleep(10);     return 0; }

編譯運行你就會發(fā)現(xiàn),運行完fprintf語句后,內(nèi)容直接輸出在終端,而不需要等到換行。一般來說,標(biāo)準(zhǔn)錯誤是不帶緩沖的。

總結(jié)

通過上面的一些例子,我們也發(fā)現(xiàn)了這樣一些規(guī)律:

  • 通常磁盤上的文件是全緩沖區(qū)的

  • 標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸入通常是行緩沖的

  • 指向終端設(shè)備的流通常是行緩沖,而指向文件時,則是全緩沖

  • 為了盡可能顯示錯誤信息,標(biāo)準(zhǔn)錯誤是不帶緩沖的

到此,關(guān)于“有哪些緩沖類型”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI