緩沖區(qū)有時(shí)也被稱作緩存,和手機(jī)app中存在的緩存類似,它存在的目的也為了提高效率。c語(yǔ)言在對(duì)一個(gè)文件進(jìn)行操作的時(shí)候,先將文件讀取到緩沖區(qū),然后對(duì)文件的操作都在緩沖區(qū)進(jìn)行,操作完成了之后才將文件寫入磁盤。
緩沖區(qū)存在的原因
那么存在這樣一個(gè)區(qū)域的具體原因是什么呢?其實(shí)這和計(jì)算機(jī)的分級(jí)緩存機(jī)制的原理差不多。最主要的方面就是將cpu釋放出來(lái),充分利用cpu的資源。其次因?yàn)閷?duì)內(nèi)存的操作速度遠(yuǎn)大于對(duì)磁盤的操作速度,這樣就提高了效率,同時(shí)還減少了對(duì)磁盤的讀寫次數(shù)。
緩沖區(qū)的類型(這里是摘自互聯(lián)網(wǎng))
緩沖區(qū) 分為三種類型:全緩沖、行緩沖和不帶緩沖。
全緩沖
在這種情況下,當(dāng)填滿標(biāo)準(zhǔn)I/O緩存后才進(jìn)行實(shí)際I/O操作。全緩沖的典型代表是對(duì)磁盤文件的讀寫。行緩沖
在這種情況下,當(dāng)在輸入和輸出中遇到換行符時(shí),執(zhí)行真正的I/O操作。這時(shí),我們輸入的字符先存放在緩沖區(qū),等按下回車鍵換行時(shí)才進(jìn)行實(shí)際的I/O操作。典型代表是標(biāo)準(zhǔn)輸入(stdin)和標(biāo)準(zhǔn)輸出(stdout)。不帶緩沖
也就是不進(jìn)行緩沖,標(biāo)準(zhǔn)出錯(cuò)情況stderr是典型代表,這使得出錯(cuò)信息可以直接盡快地顯示出來(lái)。
ANSI C( C89 )要求緩存具有下列特征:
當(dāng)且僅當(dāng)標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出并不涉及交互設(shè)備時(shí),它們才是全緩存的。
標(biāo)準(zhǔn)出錯(cuò)決不會(huì)是全緩存的。
但是,這并沒(méi)有告訴我們?nèi)绻麡?biāo)準(zhǔn)輸入和輸出涉及交互作用設(shè)備時(shí),它們是不帶緩存的還是行緩存的,以及標(biāo)準(zhǔn)輸出是不帶緩存的,還是行緩存的。
大部分系統(tǒng)默認(rèn)使用下列類型的緩存:
標(biāo)準(zhǔn)出錯(cuò)是不帶緩存的。
如果是涉及終端設(shè)備的流,則它們是行緩存的;否則是全緩存的。
我們經(jīng)常要用到標(biāo)準(zhǔn)輸入輸出流,而ANSI C對(duì)stdin、stdout和stderr的緩存特征沒(méi)有強(qiáng)行的規(guī)定,以至于不同的系統(tǒng)可能有不同的stdin、stdout和stderr的緩存特征。目前主要的緩存特征是:stdin和stdout是行緩存;而stderr是無(wú)緩存的。
緩沖區(qū)的大小
如果我們沒(méi)有自己設(shè)置緩沖區(qū)的話,系統(tǒng)會(huì)默認(rèn)為標(biāo)準(zhǔn)輸入輸出設(shè)置一個(gè)緩沖區(qū),這個(gè)緩沖區(qū)的大小通常是512個(gè)字節(jié)的大小。
緩沖區(qū)大小由 stdio.h 頭文件中的宏 BUFSIZ 定義,如果希望查看它的大小,包含頭文件,直接輸出它的值即可:
printf("%d", BUFSIZ);
緩沖區(qū)的大小是可以改變的,也可以將文件關(guān)聯(lián)到自定義的緩沖區(qū),詳情可以查看 setvbuf() 和 setbuf() 函數(shù)。
緩沖區(qū)的刷新(清空)
下列情況會(huì)引發(fā)緩沖區(qū)的刷新:
緩沖區(qū)滿時(shí);
行緩沖區(qū)遇到回車時(shí);
關(guān)閉文件;
使用特定函數(shù)刷新緩沖區(qū)。
而前面遇到的問(wèn)題,就是在stdin這個(gè)地方出現(xiàn)了問(wèn)題。scanf()這個(gè)函數(shù)屬于標(biāo)準(zhǔn)輸入,它的緩沖類型是行緩沖,前面的問(wèn)題就是函數(shù)直接獲取了輸入緩沖區(qū)中的的回車。下次再詳細(xì)的說(shuō)一下scanf(),gets_s(),getchar(),getche(),getch()這幾個(gè)函數(shù)吧。
歡迎大家評(píng)論,交流。