C語言中的輸入輸出流和緩衝區(重點)詳解

2021-09-06 07:41:00 字數 2848 閱讀 6458

c語言中我們用到的最頻繁的輸入輸出方式就是scanf()與printf()。

scanf():從標準輸入裝置(鍵盤)讀取資料,並將值存放在變數中。

printf():將指定的文字/字串輸出到標準輸出裝置(螢幕)。注意寬度輸出和精度

輸出控制。 c語言借助了相應的緩衝區來進行輸入與輸出。

如上的簡圖 ̄□ ̄|| ok,我們接下來進入正題:

「流」即是流動的意思,是物質從一處向另一處流動的過程,是對一種有序連續且具有方向性的資料( 其單位可以是bit,byte,packet )的抽象描述。

「流」:是指資訊從外部輸入裝置(如鍵盤)向計算機內部(如記憶體)輸入和從記憶體向外部輸出裝置(顯示器)輸出的過程。這種輸入輸出的過程被形象的比喻為「流」。
它的特性是:有序連續、具有方向性。

1.為什麼要引入緩衝區
例如,我們從磁碟裡取資訊,我們先把讀出的資料放在緩衝區,計算機再直接從緩衝區中取資料,等緩衝區的資料取完後再去磁碟中讀取,這樣就可以減少磁碟的讀寫次數,再加上計算機對緩衝區的操作大大快於對磁碟的操作,故應用緩衝區可大大提高計算機的執行速度。

又比如,我們使用印表機列印文件,由於印表機的列印速度相對較慢,我們先把文件輸出到印表機相應的緩衝區,印表機再自行逐步列印,這時我們的cpu可以處理別的事情。

現在您基本明白了吧,緩衝區就是一塊記憶體區, 它用在輸入輸出裝置和cpu之間,用來快取資料 。它 使得低速的輸入輸出裝置和高速的cpu能夠協調工作 ,避免低速的輸入輸出裝置占用cpu,解放出cpu,使其能夠高效率工作。

2.緩衝區的型別
緩衝區分為三種型別:全緩衝、行緩衝和不帶緩衝。

全緩衝

在這種情況下,當 填滿 標準i/o快取後才進行實際i/o操作。全緩衝的典型代表是 對磁碟檔案的讀寫 。

行緩衝

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

不帶緩衝

也就是不進行緩衝,標準出錯情況stderr是典型代表,這使得出錯資訊可以直接盡快地顯示出來。

3.緩衝區的大小
如果我們沒有自己設定緩衝區的話,系統會預設為標準輸入輸出設定乙個緩衝區,這個緩衝區的大小通常是 512個位元組 的大小。

緩衝區大小由 stdio.h 標頭檔案中的巨集 bufsiz 定義,如果希望檢視它的大小,包含標頭檔案,直接輸出它的值即可:printf("%d", bufsiz);

緩衝區的大小是可以改變的,也可以將檔案關聯到自定義的緩衝區,詳情可以檢視 setvbuf()和 setbuf() 函式。

4.緩衝區的重新整理(清空)
下列情況會引發緩衝區的重新整理:

緩衝區滿時 ; 行緩衝區遇到回車時 ; 關閉檔案 ; 使用特定函式重新整理緩衝區 。

5.結合緩衝區深度談談c語言getchar

()

先來看一下 getchar() ,其原型為: int getchar(void);

當程式呼叫getchar()函式時,程式就等著使用者按鍵, 使用者輸入的字元被存放在鍵盤緩衝區中,直到使用者按回車為止(回車字元也放在緩衝區中) 。當使用者鍵入回車之後,getchar()函式 才開始從鍵盤緩衝區中每次讀入乙個字元 。也就是說, 後續的getchar()函式呼叫不會等待使用者按鍵,而直接讀取緩衝區中的字元,直到緩衝區中的字元讀完後,才重新等待使用者按鍵 。打個比方,鍵盤緩衝區就像是一條水管連著你的程式,程式呼叫getchar()函式使用者輸入字元就相當於往水管裡注水,這個水注多少取決於你輸入多少,當你按回車停止注水時,getchar()函式才會開始從鍵盤緩衝區,也就是我們的水管裡取水,那每次只會讀乙個字元也就是每次取一定量的水,當你在這之後繼續呼叫getchar()函式時,會接著在水管裡取上次沒用完的水,因為你的水管沒清空(緩衝區的重新整理),那這個階段就不用你再輸入了,因為一呼叫getchar()函式就有水可取嘛,直到水管裡沒水了,你還呼叫getchar()函式,那這個時候你就得注水了也就是程式會等你按鍵。

通俗一點說,當程式呼叫getchar()函式時,程式就等著使用者按鍵,並等使用者按下回車鍵返回。期間按下的字元存放在緩衝區,第乙個字元作為函式返回值。繼續呼叫getchar()函式,將不再等使用者按鍵,而是返回您剛才輸入的第2個字元;繼續呼叫,返回第3個字元,直到緩衝區中的字元讀完後,才等待使用者按鍵。

getchar()函式的執行就是採用了行緩衝。第一次呼叫getchar()函式,會讓程式使用者(使用者)輸入一行字元並直至按下回車鍵 函式才返回。此時使用者輸入的字元和回車符都存放在行緩衝區。再次呼叫getchar()函式,會逐步輸出行緩衝區的內容。

請看下邊這個例子:

執行結果如下:

再把程式做微小改變:

執行結果:

上面第二次列印時不是2而是空格,你應該想到為什麼了吧?讀者可以結合上文再多思考。

從標準輸入輸出看流和緩衝區

學習標準輸入輸出,我們都會遇到乙個概念,流和緩衝區,但到底什麼是流,什麼是緩衝區呢?書 c primer plus 上說,c程式處理乙個流而不是直接處理檔案。後面的解釋十分抽象 流 stream 是乙個理想化的資料流,實際輸入或輸出對映到這個資料流 這個流具體是乙個怎麼樣的東西呢?流這個定義非常的形...

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

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

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

輸入輸出緩衝區的概念 我想以乙個例子說明,比如我想把一篇文章以字串行的方式輸出到計算機顯示器螢幕上,那麼我的程式記憶體作為資料來源而顯示器驅動程式作為資料目標,如果資料來源直接對資料目標傳送資料的話。資料目標獲得第乙個字元,便將它顯示。然後從埠讀取下乙個字元,可是這時就不能保證資料來源向埠傳送的恰好...