1、首先,我們看一下這段代碼:
?
它的簡單意思就是從鍵盤讀入一個字符,然后輸出到屏幕。理所當然,我們輸入1,輸出就是1,輸入2,輸出就是2。
那么我們如果輸出的是12呢?
?
它的輸出是1。
這里我們先簡單的解釋下,因為當我們從鍵盤輸入字符‘1’,‘2’,并按下回車后,我們的輸入被放入了輸入緩沖區,這個時候getchar()會從緩沖區中讀取我們剛才的輸入,一次只讀一個字符,所以字符1就被拿出來了,賦值給了c,然后putchar()又將c放在了標準輸出,也就是這里的屏幕,所以我們看見了最終的顯示結果1。同時字符‘1’也被緩沖區釋放了,而字符‘2’仍然被留在了緩沖區。而這樣是很不安全的,有可能下次使用的時候,我們的緩沖區會讀到一些垃圾,但是當程序結束的時候,它會自動刷新。
2、我們接著看下面的代碼:
?
大家覺得這幾行代碼是什么意思呢?大家是否真的看懂了呢?
如果你覺得你看懂了,那么我提一個問題,你覺得是不是你從鍵盤輸入一個字符就會輸出一個字符,直到遇見了換行符呢?
emmmmm。
如果你真的這么想了,那你就錯了。
它真正的運行過程應該是這樣的:還記得我們剛才說過的東西嗎,getchar()會從輸入緩沖區去讀取內容,也就是說我們把所有的內容都輸入完成并且按下了Enter鍵后,我們的輸入才被送進去了輸入緩沖區,這個時候,while循環才開始工作,每一次getchar()從輸入緩沖區讀取一個字符,然后如果不是換行符就輸出。
3、那么我們為什么要使用緩沖區呢?
舉個例子,我們知道計算機CPU的處理速度很快的,而我們鍵盤的輸入速度總是比不過CPU的處理速度,那么CPU就得一直等著鍵盤輸入完,這樣很浪費資源。于是,我們黨鍵盤輸入完了,再讓CPU一次性處理,這樣就會大大地提高效率。
又比如,我們的打印機打印文檔,打印機的處理速度是很慢的,所以我們會將文檔輸出到打印機的緩存中去,這樣打印機就可以自行慢慢打印,而不必占用CPU資源。
4、緩沖區的類型
緩沖區 分為三種類型:全緩沖、行緩沖和不帶緩沖。
1、全緩沖
在這種情況下,當填滿標準I/O緩存后才進行實際I/O操作。全緩沖的典型代表是對磁盤文件的讀寫。
2、行緩沖
在這種情況下,當在輸入和輸出中遇到換行符時,執行真正的I/O操作。這時,我們輸入的字符先存放在緩沖區,等按下回車鍵換行時才進行實際的I/O操作。典型代表是鍵盤輸入數據。
3、不帶緩沖
也就是不進行緩沖,標準出錯情況stderr是典型代表,這使得出錯信息可以直接盡快地顯示出來。
5、緩沖區的刷新
緩沖區會在以下三種情況下被刷新:
1、緩沖區滿
2、執行flush刷新緩沖區的語句
3、程序正常結束。
---------------------
作者:lws123253
來源:CSDN
原文:https://blog.csdn.net/lws123253/article/details/79848373
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!