亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C語言中輸入輸出流與緩沖區的深入講解

2020-05-23 13:26:12
字體:
來源:轉載
供稿:網友

前言

緩沖區 又稱為緩存,它是內存空間的一部分。也就是說,在內存空間中預留了一定的存儲空間,這些存儲空間用來緩沖輸入或輸出的數據,這部分預留的空間就叫做緩沖區。

緩沖區根據其對應的是輸入設備還是輸出設備,分為輸入緩沖區和輸出緩沖區。

原理介紹:

  • 當調用輸入函數scanf()時,輸入函數會將我們輸入的數字輸入到輸入緩沖區,
  • 而當我們的輸入緩沖區有內容時,再次輸入將不會被執行,
  • 而是直接跳過執行,將輸入緩沖區的內容賦給變量;

1、為什么要引入緩沖區

例如,我們從磁盤里取信息,我們先把讀出的數據放在緩沖區,計算機再直接從緩沖區中取數據,等緩沖區的數據取完后再去磁盤中讀取,這樣就可以減少磁盤的讀寫次數,再加上計算機對緩沖區的操作大大快于對磁盤的操作,故應用緩沖區可大大提高計算機的運行速度。

又比如,我們使用打印機打印文檔,由于打印機的打印速度相對較慢,我們先把文檔輸出到打印機相應的緩沖區,打印機再自行逐步打印,這時我們的CPU可以處理別的事情。

現在您基本明白了吧,緩沖區就是一塊內存區, 它用在輸入輸出設備和CPU之間,用來緩存數據 。它 使得低速的輸入輸出設備和高速的CPU能夠協調工作 ,避免低速的輸入輸出設備占用CPU,解放出CPU,使其能夠高效率工作。

2、緩沖區的類型

緩沖區分為三種類型:全緩沖、行緩沖和不帶緩沖。

1) 全緩沖

在這種情況下,當 填滿 標準I/O緩存后才進行實際I/O操作。全緩沖的典型代表是 對磁盤文件的讀寫 。

2) 行緩沖

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

3) 不帶緩沖

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

3、緩沖區的大小

如果我們沒有自己設置緩沖區的話,系統會默認為標準輸入輸出設置一個緩沖區,這個緩沖區的大小通常是 512個字節 的大小。

緩沖區大小由 stdio.h 頭文件中的宏 BUFSIZ 定義,如果希望查看它的大小,包含頭文件,直接輸出它的值即可:printf("%d", BUFSIZ);

緩沖區的大小是可以改變的,也可以將文件關聯到自定義的緩沖區,詳情可以查看 setvbuf() setbuf() 函數。

4、緩沖區的刷新(清空)

下列情況會引發緩沖區的刷新: 緩沖區滿時 ; 行緩沖區遇到回車時 ; 關閉文件 ; 使用特定函數刷新緩沖區 。

5、結合緩沖區談談C語言getchar()、getche()、getch()的區別

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

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

通俗一點說,當程序調用getchar()函數時,程序就等著用戶按鍵,并等用戶按下回車鍵返回。期間按下的字符存放在緩沖區,第一個字符作為函數返回值。繼續調用getchar()函數,將不再等用戶按鍵,而是返回您剛才輸入的第2個字符;繼續調用,返回第3個字符,直到緩沖區中的字符讀完后,才等待用戶按鍵。

getchar()函數的執行就是采用了行緩沖。第一次調用getchar()函數,會讓程序使用者(用戶)輸入一行字符并直至按下回車鍵 函數才返回。此時用戶輸入的字符和回車符都存放在行緩沖區。再次調用getchar()函數,會逐步輸出行緩沖區的內容。

請看下面一個例子:

C語言,輸入輸出流,緩沖區

運行結果如下:


C語言,輸入輸出流,緩沖區

再把程序做微小改變,你再看看,加深理解:

C語言,輸入輸出流,緩沖區

運行結果:

C語言,輸入輸出流,緩沖區

上面第二次打印時不是2而是空格,你應該想到為什么了吧?

好,我們再來看一個例子:

C語言,輸入輸出流,緩沖區

運行結果:

C語言,輸入輸出流,緩沖區

getchar()函數是從 輸入流緩沖區 中讀取數據的,而不是從 鍵盤(終端)緩沖區 讀取。當讀取遇到回車(/n)結束時,這個'/n'會一起讀入到輸入流緩沖區的, 所以第一次接收輸入時取走字符后會留下字符/n,這樣第二次getchar()直接從緩沖區中把/n取走了 ,顯然讀取成功了,所以不會再從終端讀??!其實這里的 10恰好是回車符 !這就是為什么這個程序只執行了一次輸入操作就結束的原因!

getch()和getche()函數

在TC2.0時代,C程序員總是喜歡在程序末尾加上getch() ,來實現程序運行完了暫停不退出的效果。如果不這樣做,在TC2.0的環境中Ctrl+F9編譯并運行后會立即退出程序,根本來不及看到結果。這時如果要看結果,就要按Alt+F5回到DOS環境中去,很麻煩。而如果在程序的結尾加上一行getch();語句,就可以省掉回DOS看結果這個步驟,因為程序運行完了并不退出,而是在程序最后把屏幕停住了,按任意鍵才退出程序。

實際上, getch() 的作用是從鍵盤 接收一個字符,且不帶回顯 。就是說, 你按了一個鍵后它并不在屏幕上顯示你按的什么,而繼續運行后面的代碼 ,所以在C語言中可以用它來實現“按任意鍵繼續”的效果,即程序中遇到getch();語句,就會停下來,等你按任意鍵,它接收了這個字符鍵后再繼續執行后面的代碼。這跟上面在Windows下用的system(“PAUSE")功能一樣,但卻不會在屏幕上顯示(即不會有”按任意鍵繼續“的提示),這樣,利用getch()無回顯的特性,不管你按什么鍵,都不會在屏幕上留下痕跡,使你的界面達到美觀效果。。

getche() 和getch()很相似,它也需要引入頭文件conio.h,它們之間的區別就在于:getch()無回顯,getche()有回顯。

下面看一個例子:

C語言,輸入輸出流,緩沖區

首先這是個連續5次的循環來實現5次停頓,等待你輸入。編譯并運行這個程序,假設輸入的是abcde,那么屏幕上顯示的結果也是abcde,這個abcde并不是在ch=getch();中輸出的。把printf("%c",ch);這行語句去掉,就會發現按5次任意鍵程序就結束了,但屏幕上什么都沒有顯示。

你可以把代碼中的getch()換成getche()看看有什么不同。如果還是輸入abcde,那么屏幕上顯示的結果是aabbccddee,我們把printf("%c",ch);這行語句再去掉,顯示的結果就是abcde了,說明程序在執行ch=getche();這條語句的時候就把我們輸入的鍵返回顯示在屏幕上, 有無回顯就是它們的唯一區別 。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲性视频网站| 色婷婷**av毛片一区| 欧美大全免费观看电视剧大泉洋| 国产一区红桃视频| 国产成人精品一区二区| 亚洲欧美日韩天堂一区二区| 久久精品电影网| 欧美性xxxxhd| 亚洲欧美三级在线| 国产精品久久久久久久美男| 中文字幕在线视频日韩| 久久香蕉频线观| 中文字幕亚洲欧美日韩高清| 欧美丝袜第一区| 国产成人久久久精品一区| www.xxxx欧美| 日韩欧美亚洲范冰冰与中字| 日韩高清电影好看的电视剧电影| 在线观看国产精品淫| 欧美综合国产精品久久丁香| 成人在线中文字幕| 97精品国产aⅴ7777| 欧美日韩裸体免费视频| 国产国语刺激对白av不卡| 91精品国产自产在线老师啪| 久久精品国产久精国产一老狼| 午夜免费日韩视频| 日韩大片免费观看视频播放| 亚洲最大成人在线| 日韩av免费在线播放| 欧美色xxxx| 美女福利精品视频| 国产精品久久久久久久久久久久久| 亚洲视频在线观看视频| 91精品久久久久| 精品调教chinesegay| 国产日产亚洲精品| 久久久久中文字幕2018| 亚洲国产日韩欧美在线动漫| 久久久亚洲欧洲日产国码aⅴ| 午夜精品一区二区三区在线播放| 国产精品视频久| 国产精品女人网站| 欧美性生活大片免费观看网址| 亚洲第五色综合网| 91成人在线播放| 亚洲欧美另类自拍| 久久免费视频这里只有精品| 国产日韩欧美日韩大片| 热re99久久精品国产66热| 三级精品视频久久久久| 久色乳综合思思在线视频| 日韩在线视频国产| 亚洲第一av在线| 国产精品高精视频免费| 中文字幕在线看视频国产欧美在线看完整| 久久影视电视剧免费网站清宫辞电视| 中文字幕视频一区二区在线有码| 91精品国产综合久久久久久久久| 国产成人极品视频| 亚洲日韩第一页| 国产成人高潮免费观看精品| 亚洲国产天堂久久国产91| 91网站免费看| 成人天堂噜噜噜| 国产精品偷伦视频免费观看国产| 成人情趣片在线观看免费| 久久香蕉国产线看观看av| 成人黄色片在线| 久久视频中文字幕| 久久香蕉频线观| 亚洲欧美日韩网| 亚洲激情 国产| 色偷偷9999www| 欧美综合国产精品久久丁香| 羞羞色国产精品| 日韩av在线网页| 欧美激情在线有限公司| 日本精品久久久久久久| 国产狼人综合免费视频| 欧美日韩色婷婷| 日韩成人激情影院| 久久久久久久网站| 一个色综合导航| 久久精品一本久久99精品| 2019亚洲男人天堂| 日韩精品中文字幕在线播放| 日韩电影中文字幕在线观看| 45www国产精品网站| 国产精品一区二区三区免费视频| 欧日韩在线观看| 高清欧美性猛交| 亚洲japanese制服美女| 日产精品久久久一区二区福利| 久久亚洲一区二区三区四区五区高| 78m国产成人精品视频| 欧美激情xxxx| 国产亚洲精品久久久久久777| 最好看的2019的中文字幕视频| 久久国产精品久久久久久| 亚洲欧美在线免费观看| 国产福利视频一区| 中文字幕欧美日韩| 国产成+人+综合+亚洲欧洲| 国产欧美最新羞羞视频在线观看| 日韩精品福利在线| 成人有码视频在线播放| 亚洲精品一区久久久久久| 久久久久久久久久久久av| 亚洲福利视频专区| 亚洲加勒比久久88色综合| 国内精品中文字幕| 国产精品视频成人| 色综合久久久888| 久久99青青精品免费观看| 欧美最猛性xxxxx免费| 国产精品igao视频| 日韩精品免费综合视频在线播放| 91麻豆国产语对白在线观看| 欧美激情区在线播放| 日韩精品视频在线观看免费| 欧美在线一级视频| 日韩高清人体午夜| 亚洲欧洲午夜一线一品| 亚洲91精品在线| 日韩视频亚洲视频| 国产激情综合五月久久| 国产亚洲精品91在线| 91美女高潮出水| 日韩女在线观看| 最近2019年中文视频免费在线观看| 黑人巨大精品欧美一区二区三区| 亚洲色图色老头| 亚洲美女性视频| 国模精品视频一区二区| 国产亚洲精品久久久久动| 亚洲精品白浆高清久久久久久| 国产精品久久久一区| 亚洲电影免费观看高清完整版| 91免费精品国偷自产在线| 中文字幕日韩av综合精品| 精品网站999www| 亚洲色图美腿丝袜| 久久久久久久影院| 久久久女女女女999久久| 亚洲一级黄色av| 精品国产精品自拍| 亚洲欧洲一区二区三区久久| 国产成人97精品免费看片| 久久久视频精品| 国产精品视频在线观看| 欧美激情免费观看| 日韩久久免费视频| 久久综合伊人77777尤物| 久久中文精品视频| 日韩中文字幕在线看| 九九热在线精品视频| 国产成人在线亚洲欧美| 亚洲最新av在线网站| 国产综合在线看| 亚洲欧美变态国产另类| 色婷婷成人综合| 日韩在线欧美在线| 日韩在线免费视频|