從乙個簡單的例子開始:
可以看到沒等第二次的關鍵字的輸入程式就執行結束了,這是為什麼呢?要充分理解這個問題我們需要理解c語言中對緩衝區的概念。
在這之前我們初步分析一下,scanf函式輸入字串的的情況下空白字元(空格,回車,tab)都只是被視為分隔符,關於這一點可以參考c語言中scanf與分隔符(空格回車tab)這篇博文,當我們輸入字串jj後按回車的時候就會把jj連同換行符送入緩衝區,然而scanf只會接收字串jj,並把這個字串送入到以a為首位址的位址空間中,同時在字串後面自動加上乙個\0,那麼如今緩衝區內就只有乙個換行符了。當執行到gets()函式的時候,因為緩衝區內非空,那麼gets直接回讀取緩衝區中的換行符複製到str為首位址的記憶體空間,同時在字串後面自動加上乙個\0,所以輸出的str的結果就是乙個換行罷了。
當我們取消程式中注釋語句getchar()的時候,getchar()會接收緩衝區中的而第乙個字元,那麼緩衝區便空了。當執行到gets()的時候,由於緩衝區為空,那麼程式便會停在gets()位置處的等待輸入。然後我們輸入字串並且按回車將字串送入緩衝區後,因為gets()的功能是獲取緩衝區中的字串,遇到換行符或者eof後停止,所以gets()取出緩衝區內所有的字串以及換行符,所以輸出的結果如下圖示:
可以看到連同換行符也一起輸出來了。
當然除了使用getchar()來消除換行符的影響,也可以使用fflush(stdin)來重新整理緩衝區,同樣可以起到消除換行符的效果。因為fflush(stdin)的作用是清除標準輸入緩衝區中的內容。
有了一些感性的認識,我們來看看緩衝區的概念和它的機制。
一、什麼是緩衝區
緩衝區又稱為快取,它是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區。
緩衝區根據其對應的是輸入裝置還是輸出裝置,分為輸入緩衝區和輸出緩衝區。
二、為什麼要引入緩衝區
我們為什麼要引入緩衝區呢?
比如我們從磁碟裡取資訊,我們先把讀出的資料放在緩衝區,計算機再直接從緩衝區中取資料,等緩衝區的資料取完後再去磁碟中讀取,這樣就可以減少磁碟的讀寫次數,再加上計算機對緩衝區的操作大大快於對磁碟的操作,故應用緩衝區可大大提高計算機的執行速度。
又比如,我們使用印表機列印文件,由於印表機的列印速度相對較慢,我們先把文件輸出到印表機相應的緩衝區,印表機再自行逐步列印,這時我們的cpu可以處理別的事情。
現在您基本明白了吧,緩衝區就是一塊記憶體區,它用在輸入輸出裝置和cpu之間,用來快取資料。它使得低速的輸入輸出裝置和高速的cpu能夠協調工作,避免低速的輸入輸出裝置占用cpu,解放出cpu,使其能夠高效率工作。
三、緩衝區的型別
緩衝區 分為三種型別:全緩衝、行緩衝和不帶緩衝。
1、全緩衝
在這種情況下,當填滿標準i/o快取後才進行實際i/o操作。全緩衝的典型代表是對磁碟檔案的讀寫。
2、行緩衝
在這種情況下,當在輸入和輸出中遇到換行符時,執行真正的i/o操作。這時,我們輸入的字元先存放在緩衝區,等按下回車鍵換行時才進行實際的i/o操作。典型代表是鍵盤輸入資料。
3、不帶緩衝
也就是不進行緩衝,標準出錯情況stderr是典型代表,這使得出錯資訊可以直接盡快地顯示出來。
四、緩衝區的重新整理
下列情況會引發緩衝區的重新整理:
緩衝區滿時;
執行flush語句;
執行endl語句;
關閉檔案。
可見,緩衝區滿或關閉檔案時都會重新整理緩衝區,進行真正的i/o操作。另外,在c++中,我們可以使用flush函式來重新整理緩衝區(執行i/o操作並清空緩衝區)
鍵盤操作演示行緩衝
先介紹getchar()函式。
函式原型:int getchar(void);
說明:當程式呼叫getchar()函式時,程式就等著使用者按鍵,使用者輸入的字元被存放在鍵盤緩衝區中,直到使用者按回車為止(回車字元也放在緩衝區中)。當使用者鍵入回車之後,getchar()函式才開始從鍵盤緩衝區中每次讀入乙個字元。也就是說,後續的getchar()函式呼叫不會等待使用者按鍵,而直接讀取緩衝區中的字元,直到緩衝區中的字元讀完後,才重新等待使用者按鍵。
不知道您明白了沒有,再通俗一點講,當程式呼叫getchar()函式時,程式就等著使用者按鍵,並等使用者按下回車鍵返回。期間按下的字元存放在緩衝區,第乙個字元作為函式返回值。繼續呼叫getchar()函式,將不再等使用者按鍵,而是返回您剛才輸入的第2個字元;繼續呼叫,返回第3個字元,直到緩衝區中的字元讀完後,才等待使用者按鍵。
getchar()函式的執行就是採用了行緩衝。第一次呼叫getchar()函式,會讓程式使用者(使用者)輸入一行字元並直至按下回車鍵 函式才返回。此時使用者輸入的字元和回車符都存放在行緩衝區。再次呼叫getchar()函式,會逐步輸出行緩衝區的內容。
執行一段**體會一下:
[cpp]view plain
copy
print?
#include
int main()
#include int main()
執行結果:
不斷輸入資料,當不能再輸入資料的時候說明緩衝區已滿,輸入的字元的數目為4096,即4k.那麼快可以知道緩衝區的大小為4k。
c語言裡緩衝區的理解
從乙個簡單的例子開始 cpp view plain copy include int main include int main 12 3456 78910 1112 1314 1516 17可以看到沒等第二次的關鍵字的輸入程式就執行結束了,這是為什麼呢?要充分理解這個問題我們需要理解c語言中對緩衝...
C 緩衝區的理解
下面介紹緩衝區的知識。一 什麼是緩衝區 緩衝區又稱為快取,它是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區。緩衝區根據其對應的是輸入裝置還是輸出裝置,分為輸入緩衝區和輸出緩衝區。二 為什麼要引入緩衝區 我們為什麼...
緩衝區理解
在講緩衝區之前,我們要先介紹下記憶體的作用。記憶體是計算機中重要的部件之一,它是與cpu進行溝通的橋梁。計算機中所有程式的執行都是在記憶體中進行的,其作用是用於暫時存放cpu中的運算資料,以及與硬碟等外部儲存器交換的資料。也就是說 只要計算機在執行中,cpu就會把需要運算的資料調到記憶體中進行運算,...