c語言筆記——對緩衝區的理解

  緩衝區有時也被稱作緩存,和手機app中存在的緩存類似,它存在的目的也爲了提高效率。c語言在對一個文件進行操作的時候,先將文件讀取到緩衝區,然後對文件的操作都在緩衝區進行,操作完成了之後纔將文件寫入磁盤。

緩衝區存在的原因

  那麼存在這樣一個區域的具體原因是什麼呢?其實這和計算機的分級緩存機制的原理差不多。最主要的方面就是將cpu釋放出來,充分利用cpu的資源。其次因爲對內存的操作速度遠大於對磁盤的操作速度,這樣就提高了效率,同時還減少了對磁盤的讀寫次數。還有一部分原因是因爲,對文件的讀寫還有對其他一些設備的直接操作涉及到一些硬件方面的細節(因不同的平臺和設備而不同),使用緩衝區的話程序員僅僅需要關注對緩衝操作,對文件和設備的操作交給操作系統去處理就可以了。

緩衝區的類型(這裏是摘自互聯網)

緩衝區 分爲三種類型:全緩衝、行緩衝和不帶緩衝。

1) 全緩衝
在這種情況下,當填滿標準I/O緩存後才進行實際I/O操作。全緩衝的典型代表是對磁盤文件的讀寫。

2) 行緩衝
在這種情況下,當在輸入和輸出中遇到換行符時,執行真正的I/O操作。這時,我們輸入的字符先存放在緩衝區,等按下回車鍵換行時才進行實際的I/O操作。典型代表是標準輸入(stdin)和標準輸出(stdout)。

3) 不帶緩衝
也就是不進行緩衝,標準出錯情況stderr是典型代表,這使得出錯信息可以直接儘快地顯示出來。

ANSI C( C89 )要求緩存具有下列特徵:
當且僅當標準輸入和標準輸出並不涉及交互設備時,它們纔是全緩存的。
標準出錯決不會是全緩存的。

但是,這並沒有告訴我們如果標準輸入和輸出涉及交互作用設備時,它們是不帶緩存的還是行緩存的,以及標準輸出是不帶緩存的,還是行緩存的。

大部分系統默認使用下列類型的緩存:
標準出錯是不帶緩存的。
如果是涉及終端設備的流,則它們是行緩存的;否則是全緩存的。

我們經常要用到標準輸入輸出流,而ANSI C對stdin、stdout和stderr的緩存特徵沒有強行的規定,以至於不同的系統可能有不同的stdin、stdout和stderr的緩存特徵。目前主要的緩存特徵是:stdin和stdout是行緩存;而stderr是無緩存的。
緩衝區的大小

如果我們沒有自己設置緩衝區的話,系統會默認爲標準輸入輸出設置一個緩衝區,這個緩衝區的大小通常是512個字節的大小。

緩衝區大小由 stdio.h 頭文件中的宏 BUFSIZ 定義,如果希望查看它的大小,包含頭文件,直接輸出它的值即可:
printf(“%d”, BUFSIZ);

緩衝區的大小是可以改變的,也可以將文件關聯到自定義的緩衝區,詳情可以查看 setvbuf() 和 setbuf() 函數。
緩衝區的刷新(清空)

下列情況會引發緩衝區的刷新:
緩衝區滿時;
行緩衝區遇到回車時;
關閉文件;
使用特定函數刷新緩衝區。
  而前面遇到的問題,就是在stdin這個地方出現了問題。scanf()這個函數屬於標準輸入,它的緩衝類型是行緩衝,前面的問題就是函數直接獲取了輸入緩衝區中的的回車。下次再詳細的說一下scanf(),gets_s(),getchar(),getche(),getch()這幾個函數吧。這裏是我在github上的一個博客,感興趣的可以去看一下哦
  歡迎大家評論,交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章