關於C之緩衝輸入

2021-09-29 07:23:05 字數 2076 閱讀 7979

先看乙個看似很簡單的例子: 

#include int main(void)
|hello, there. i would[enter]

hello, there. i would

|like a #3 bag of potatoes.[enter]

like a

在while迴圈裡面,按常理理解,先通過getchar()輸入乙個字元,由於!='#',就直接執行putchar()函式在螢幕上列印輸出剛輸入的字元,但結果並非如此。通過斷點除錯發現,在輸入一大段字元的過程中迴圈體裡面putchar(ch);這行始終沒有執行,直至按下回車鍵[enter]時,斷點才跳到putchar(ch); 把剛輸入的字元全部列印出來了。也就是說,不按回車鍵,就把輸入的字元一直存入緩衝區,就無法執行下面的列印語句,直到按下回車鍵結束緩衝區

為止。(注:回車符[enter]也是乙個字元'\n'也會被緩衝,能被getchar()讀取)

如果在老式系統執行上面的程式, 你輸入文字時可能顯示如下:

hheelllloo,, tthheerree..ii wwoouulldd[enter]

lliikkee aa #

while迴圈中先getchar乙個字元'h',然後執行迴圈體裡面的函式putchar立即列印這個字元'h',即輸入什麼就立馬列印什麼,[enter]鍵單純的就是換行。其他字元輸入輸出一樣的道理。這樣理解,上面的顯示就完全解釋的通了。

以上行為是個例外。像這樣回顯使用者輸入的字元後立即重複列印該字元是屬於無緩衝( 或直接)輸入,即正在等待的程式可立即使用輸入的字元。

你可能好奇,為何輸入的字元能直接顯示在螢幕上?如果用乙個特殊字元( 如,#)來結束輸入,就無法在文字中使用這個字元,是否有更好的方法結束輸入?要回答這些問題,首先要了解 c程式如何處理鍵盤輸入,尤其是緩衝和標準輸入檔案的概念。 

對於該例,大部分系統在使用者按下enter鍵之前不會重複列印剛輸入的字元,這種輸入形式屬於緩衝輸入。使用者輸入的字元被收集並儲存在乙個被稱為緩衝區( buffer)的臨時儲存區,按下enter鍵後,程式才可使用使用者輸入的字元。

為什麼要有緩衝區?

首先, 把若干字元作為乙個塊進行傳輸比逐個傳送這些字元節約時間。

其次,如果使用者打錯字符,可以直接通過鍵盤修正錯誤。當最後按下enter鍵時,傳輸的是正確的輸入。

雖然緩衝輸入好處很多, 但是某些互動式程式也需要無緩衝輸入。例如,在遊戲中,你希望按下乙個鍵就執行相應的指令。因此,緩衝輸入和無緩衝輸入都有用武之地。

緩衝分為兩類: 完全緩衝i/o和行緩衝i/o。 完全緩衝輸入指的是當緩衝區被填滿時才重新整理緩衝區( 內容被傳送至目的地),通常出現在檔案輸入中。 緩衝區的大小取決於系統,常見的大小是 512 位元組和 4096位元組。行緩衝i/o指的是在出現換行符時重新整理緩衝區。鍵盤輸入通常是行緩衝輸入,所以在按下enter鍵後才重新整理緩衝區。

那麼,使用緩衝輸入還是無緩衝輸入?ansi c和後續的c標準都規定輸入是緩衝的,不過最初k&r把這個決定權交給了編譯器的編寫者。 你可以執行最上面的程式觀察輸出的情況,了解所用的輸出型別。

ansi c決定把緩衝輸入作為標準的原因是: 一些計算機不允許無緩衝輸入。如果你的計算機允許無緩衝輸入,那麼你所用的c編譯器很可能會提供乙個無緩衝輸入的選項。 例如,許多ibm pc相容機的編譯器都為支援無緩衝輸入提供一系列特殊的函式,其原型都在conio.h標頭檔案中。這些函式包括用於回顯無緩衝輸入的getche()函式和用於無回顯無緩衝輸入的getch()函式(回顯輸入意味著使用者輸入的字元直接顯示在螢幕上,無回顯輸入意味著擊鍵後對應的字元不顯示)。unix系統使用另一種不同的方式控制緩衝。在unix系統中,可以使用ioctl()函式( 該函式屬於unix庫,但是不屬於c標準)指定待輸入的型別,然後用getchar()執行相應的操作。在ansi c中,用setbuf()和setvbuf()函式控制緩衝,但是受限於一些系統的內部設定,這些函式可能不起作用。總之,ansi沒有提供呼叫無緩衝輸入的標準方式,這意味著是否能進行無緩衝輸入取決於計算機系統。鑑於此,在這裡要對所有的輸入都是緩衝輸入。

c c 緩衝輸入和非緩衝輸入

c語言有緩衝輸入和非緩衝輸入兩種情況,預設緩衝輸入,因為有的計算機不支援非緩衝輸入。緩衝輸入下,通過標準輸入 鍵盤 輸入的字元會先存在輸入緩衝區裡,同時會回顯到螢幕上。這樣就可以在輸入回車 將輸入緩衝區清空,併發送到程式的輸入佇列中,供程式使用 之前,進行輸入的修改。但是也支援非緩衝輸入,不需要輸入...

關於行緩衝輸入的相關細節

緩衝輸入又分為完全緩衝輸入與行緩衝輸入,與鍵盤相關的一般指行緩衝輸入,因此我們主要了解行緩衝輸入 行緩衝輸入是指鍵盤輸入的字元暫存在緩衝區,當遇到回車符時將緩衝區裡的內容傳送到程式並重新整理緩衝區,以下是乙個典型的行緩衝輸入的例子 include intmain 1 輸入6 沒有按回車鍵 2 按回車...

緩衝輸入流

快取輸入流 bufferedinputstream繼承於filterinputstream,提供緩衝輸入流功能。緩衝輸入流相對於普通輸入流的優勢是,它提供了乙個緩衝陣列,每次呼叫read方法的時候,它首先嘗試從緩衝區裡讀取資料,若讀取失敗 緩衝區無可讀資料 則選擇從物理資料來源 譬如檔案 讀取新資料...