c語言輸入輸出緩衝區的概念

2021-04-28 14:33:25 字數 2704 閱讀 4177

輸入輸出緩衝區的概念

我想以乙個例子說明,比如我想把一篇文章以字串行的方式輸出到計算機顯示器螢幕上,那麼我的程式記憶體作為資料來源而顯示器驅動程式作為資料目標,如果資料來源直接對資料目標傳送資料的話。資料目標獲得第乙個字元,便將它顯示。然後從埠讀取下乙個字元,可是這時就不能保證資料來源向埠傳送的恰好是第二個字元(也許是第三個,而第二個已經在資料目標顯示時傳送過了)。這樣的話就不能保證輸出的資料能完整的被資料目標所接受並處理。

為了解決這個問題,我們需要在資料來源與資料目標中間放置乙個儲存完整資料內容的區域,那就是 「緩衝區」。這樣的話, 資料來源可以不考慮資料目標正在處理哪部分資料,只要把資料輸出到緩衝區就可以了,資料目標也可以不考慮資料來源的傳送頻率,只是從緩衝區中依次取出下乙個資料。從而保證了資料傳送的完整性,同時也提高了程式的效率。

當然getch(),getche()沒有用到緩衝區。

getchar詳解

getchar()是stdio.h中的庫函式,它的作用是從stdin流中讀入乙個字元,也就是說,如果stdin有資料的話不用輸入它就可以直接讀取了。而getch()和getche()是conio.h中的庫函式,它的作用是從鍵盤接收字元。

與前面兩個函式的區別在於: getchar()函式等待輸入直到按回車才結束(前提是緩衝區沒有資料),回車前的所有輸入字元都會逐個顯示在螢幕上。但只有第乙個字元作為函式的返回值。

#include

#include

void main()

char c;

while ((c=getchar())!='/n') /*每個getchar()依次讀入乙個字元*/

printf("%c",c); /*按照原樣輸出*/

printf("/n/n");

程式執行時,首先停下來,等你輸入一串字串,輸入完畢後,它把你輸入的整個字串都輸出來了,咦,你不是說getchar()只返回第乙個字元麼,這裡怎麼?

因為我們輸入的字串並不是取了第乙個字元就把剩下的字串丟掉了,它還在我們的記憶體中,就好比,開閘放水,我們把水放到閘裡去以後,開一次閘就放掉一點,開一次就放掉一點,直到放光了為止,這裡開閘動作就相當於呼叫一次getchar()。我們輸入的字串也是這麼一回事,首先我們輸入的字串是放在記憶體的緩衝區中的,我們呼叫一次getchar()就把緩衝區中里出口最近的乙個字元輸出,也就是最前面的乙個字元輸出,輸出後,就把它釋放掉了,但後面還有字串,所以我們就用迴圈把最前面的乙個字元乙個個的在記憶體中釋放掉,直到不滿足迴圈條件退出為止。

例子中迴圈條件裡的'/n'實際上就是你輸入字串後的回車符,所以意思就是說,直到遇到回車符才結束迴圈,而getchar()函式就是等待輸入(或緩衝區中的資料)直到按回車才結束,所以實現了整個字串的輸出。當然,我們也可以把迴圈條件改一下,比如while((c=getchar())!='a'),什麼意思呢,意思就是遇到字元'a'就停止迴圈,當然意思是如果你輸入「12345a213123/n」那麼只會輸出到a,結果是12345

補充:按鍵盤上的回車產生了2個字元:回車符('/r')和換行符('/n')。回車符'/r'(cr:carriage return:倒車)使游標回到這行的首部,換行符('/n')(new line)然後再換行。所以當輸入字元'w',並按下回車鍵以後。首先得到回車符。那個getchar函式結束了。 但是還存在乙個換行符。所以如果用getchar()來做判斷的時候。最好再寫一次getchar()清除緩衝區的'/n'。(這個內部機制,需詳細理解。我的理解是回車符使getchar結束,緩衝區裡存在的是換行符)

再來一段code:

#include

main()

char c;

for(;(c=getchar())!='a';)

printf("%c",c);

getchar();

c=getchar();

printf("%c",c);

輸入:ssss回車

得到:ssss  游標處(等待輸入)

說明:此時程式沒有結束,進行到for迴圈,因為並沒有字元a出現,所以還沒跳出for迴圈.鍵入回車後,getchar依次從緩衝區內取出(for迴圈):'s''s''s''s''/n'。 

如果我們輸入:ssssa回車

得到:ssss游標處(等待輸入)

說明:程式已經跳出for迴圈,但是由於我們用getchar();清除了換行'/n',後面第7句c=getchar();需要你輸入乙個字元(因為 ssssa後面並沒有新的字元),所以程式仍然沒有結束.如果我們注釋掉getchar();這一句,那麼得到:ssss游標處(程式結束)。這個輸入ssssa是的回車中的換行符'/n'就被c=getchar();這一句讀取並輸出了。 

如果我們輸入:ssssabcd....

得到:ssssb

想想這是為什麼?(最近一次檢驗結果和預期不一樣,回車符可能在for迴圈已經被清理掉了)

c++中:

重新整理,是以緩衝方式開啟乙個檔案時,往檔案裡寫幾個位元組,一般不會立即真正把這幾個位元組寫入檔案,只有當緩衝區滿時才真正寫盤。如果想在緩衝區滿之前寫盤儲存,可以做沖刷緩衝區動作。下列行為引發沖刷動作:

1)緩衝區滿時;

2)行輸出時遇endl;

3)執行沖刷函式(好像叫fflush or flush?);

4)關閉檔案。

C語言標準輸入輸出緩衝區

緩衝區特徵 緩衝例項 file結構定義 參考資料 緩衝區又稱為快取,它是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區。緩衝區根據其對應的是輸入裝置還是輸出裝置,分為輸入緩衝區和輸出緩衝區。為什麼要引入緩衝區 比如...

Redis 輸入輸出緩衝區

id 客戶端連線的唯一標識,這個id是隨著redis的連線自增的,重啟redis後會重置為0 addr 客戶端連線的ip和埠 fd socket的檔案描述符,與lsof命令結果中的fd是同乙個,如果fd 1代表當前客戶端不是外部客戶端,而是redis內部的偽裝客戶端。name 客戶端的名字,後面的c...

輸入緩衝區與輸出緩衝區

本博文通過一段程式來理解輸入緩衝區與輸出緩衝區。程式如下 author wanghao created time thu 17 may 2018 06 03 12 ampdt file name test.c description include int main int argc,const c...