c語(yǔ)言筆記——對(duì)緩沖區(qū)的理解

緩沖區(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ū) 分為三種類型:全緩沖、行緩沖和不帶緩沖。

  1. 全緩沖
    在這種情況下,當(dāng)填滿標(biāo)準(zhǔn)I/O緩存后才進(jìn)行實(shí)際I/O操作。全緩沖的典型代表是對(duì)磁盤文件的讀寫。

  2. 行緩沖
    在這種情況下,當(dāng)在輸入和輸出中遇到換行符時(shí),執(zhí)行真正的I/O操作。這時(shí),我們輸入的字符先存放在緩沖區(qū),等按下回車鍵換行時(shí)才進(jìn)行實(shí)際的I/O操作。典型代表是標(biāo)準(zhǔn)輸入(stdin)和標(biāo)準(zhǔn)輸出(stdout)。

  3. 不帶緩沖
    也就是不進(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)論,交流。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • C/C++輸入輸出流總結(jié) 前兩天寫C++實(shí)習(xí)作業(yè),突然發(fā)現(xiàn)I/O是那么的陌生,打了好長(zhǎng)時(shí)間的文件都沒(méi)有打開(kāi),今天終...
    LuckTime閱讀 1,808評(píng)論 0 6
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無(wú)法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 13,269評(píng)論 2 33
  • 一、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡(jiǎn)單分配策略的問(wèn)題地址空間不隔離內(nèi)存使用效率低程序運(yùn)行的地址不確定 關(guān)于...
    SeanCST閱讀 8,136評(píng)論 0 27
  • 總有一些話 來(lái)不及說(shuō)了 總有一個(gè)人 是心口的朱砂 想起那些花 那些傻 眼淚落下 只留一句 你現(xiàn)在好嗎 總有一些話,...
    蟈蟈dia閱讀 273評(píng)論 0 0
  • 有些話,以前聽(tīng)著是真理,如今再看,這些話是錯(cuò)的。它們帶著歧視,藏著武斷,甚至還是一些人逃避責(zé)任的說(shuō)辭。你被這些話騙...
    小太陽(yáng)下的烏龜閱讀 1,312評(píng)論 14 33

友情鏈接更多精彩內(nèi)容