c語言裡緩衝區的理解

2021-09-25 23:50:24 字數 2694 閱讀 9753

從乙個簡單的例子開始:

[cpp] view plain copy

#include

int main()

#include

int main()12

3456

78910

1112

1314

1516

17可以看到沒等第二次的關鍵字的輸入程式就執行結束了,這是為什麼呢?要充分理解這個問題我們需要理解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

#include

int main()

#include

int main()12

3456

78910

11執行結果:

不斷輸入資料,當不能再輸入資料的時候說明緩衝區已滿,輸入的字元的數目為4096,即4k.那麼快可以知道緩衝區的大小為4k。

c語言裡緩衝區的理解

從乙個簡單的例子開始 可以看到沒等第二次的關鍵字的輸入程式就執行結束了,這是為什麼呢?要充分理解這個問題我們需要理解c語言中對緩衝區的概念。在這之前我們初步分析一下,scanf函式輸入字串的的情況下空白字元 空格,回車,tab 都只是被視為分隔符,關於這一點可以參考c語言中scanf與分隔符 空格回...

C 緩衝區的理解

下面介紹緩衝區的知識。一 什麼是緩衝區 緩衝區又稱為快取,它是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區。緩衝區根據其對應的是輸入裝置還是輸出裝置,分為輸入緩衝區和輸出緩衝區。二 為什麼要引入緩衝區 我們為什麼...

緩衝區理解

在講緩衝區之前,我們要先介紹下記憶體的作用。記憶體是計算機中重要的部件之一,它是與cpu進行溝通的橋梁。計算機中所有程式的執行都是在記憶體中進行的,其作用是用於暫時存放cpu中的運算資料,以及與硬碟等外部儲存器交換的資料。也就是說 只要計算機在執行中,cpu就會把需要運算的資料調到記憶體中進行運算,...