最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年09月23日 12:19:43   作者:易寒不易寒  
一般情況下,由鍵盤輸入的字符并沒有直接送入程序,而是被存儲在一個緩沖區(qū)當(dāng)中。下面這篇文章主要給大家介紹了關(guān)于C語言中輸入輸出流與緩沖區(qū)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

緩沖區(qū) 又稱為緩存,它是內(nèi)存空間的一部分。也就是說,在內(nèi)存空間中預(yù)留了一定的存儲空間,這些存儲空間用來緩沖輸入或輸出的數(shù)據(jù),這部分預(yù)留的空間就叫做緩沖區(qū)。

緩沖區(qū)根據(jù)其對應(yīng)的是輸入設(shè)備還是輸出設(shè)備,分為輸入緩沖區(qū)和輸出緩沖區(qū)。

原理介紹:

  • 當(dāng)調(diào)用輸入函數(shù)scanf()時,輸入函數(shù)會將我們輸入的數(shù)字輸入到輸入緩沖區(qū),
  • 而當(dāng)我們的輸入緩沖區(qū)有內(nèi)容時,再次輸入將不會被執(zhí)行,
  • 而是直接跳過執(zhí)行,將輸入緩沖區(qū)的內(nèi)容賦給變量;

1、為什么要引入緩沖區(qū)

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

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

現(xiàn)在您基本明白了吧,緩沖區(qū)就是一塊內(nèi)存區(qū), 它用在輸入輸出設(shè)備和CPU之間,用來緩存數(shù)據(jù) 。它 使得低速的輸入輸出設(shè)備和高速的CPU能夠協(xié)調(diào)工作 ,避免低速的輸入輸出設(shè)備占用CPU,解放出CPU,使其能夠高效率工作。

2、緩沖區(qū)的類型

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

1) 全緩沖

在這種情況下,當(dāng) 填滿 標(biāo)準(zhǔn)I/O緩存后才進(jìn)行實際I/O操作。全緩沖的典型代表是 對磁盤文件的讀寫 。

2) 行緩沖

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

3) 不帶緩沖

也就是不進(jìn)行緩沖,標(biāo)準(zhǔn)出錯情況stderr是典型代表,這使得出錯信息可以直接盡快地顯示出來。

3、緩沖區(qū)的大小

如果我們沒有自己設(shè)置緩沖區(qū)的話,系統(tǒng)會默認(rèn)為標(biāo)準(zhǔn)輸入輸出設(shè)置一個緩沖區(qū),這個緩沖區(qū)的大小通常是 512個字節(jié) 的大小。

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

緩沖區(qū)的大小是可以改變的,也可以將文件關(guān)聯(lián)到自定義的緩沖區(qū),詳情可以查看 setvbuf() setbuf() 函數(shù)。

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

下列情況會引發(fā)緩沖區(qū)的刷新: 緩沖區(qū)滿時 ; 行緩沖區(qū)遇到回車時 ; 關(guān)閉文件 ; 使用特定函數(shù)刷新緩沖區(qū) 。

5、結(jié)合緩沖區(qū)談?wù)凜語言getchar()、getche()、getch()的區(qū)別

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

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

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

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

請看下面一個例子:


運行結(jié)果如下:


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


運行結(jié)果:


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

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


運行結(jié)果:


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

getch()和getche()函數(shù)

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

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

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

下面看一個例子:


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

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

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Qt兩種定時器使用實現(xiàn)方式

    Qt兩種定時器使用實現(xiàn)方式

    這篇文章主要給大家介紹了關(guān)于Qt兩種定時器使用實現(xiàn)方式的相關(guān)資料,Qt中的定時器類是QTimer,QTimer不是一個可見的界面組件,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • Qt5.9畫五角星的方法

    Qt5.9畫五角星的方法

    這篇文章主要為大家詳細(xì)介紹了Qt5.9畫五角星的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C++中move的使用及說明

    C++中move的使用及說明

    這篇文章主要介紹了C++中move的使用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言中字母大小寫轉(zhuǎn)化簡單示例

    C語言中字母大小寫轉(zhuǎn)化簡單示例

    在C語言中,有時候我們遇到這樣的考題,將c語言大寫字母轉(zhuǎn)化為小寫字母,下面這篇文章主要給大家介紹了關(guān)于C語言中字母大小寫轉(zhuǎn)化的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • 詳解如何用c++實現(xiàn)平衡二叉樹

    詳解如何用c++實現(xiàn)平衡二叉樹

    平衡二叉樹(Balanced Binary Tree)又被稱為AVL樹(有別于AVL算法),由前蘇聯(lián)的數(shù)學(xué)家Adelse-Velskil和Landis在1962年提出的高度平衡的二叉樹,根據(jù)科學(xué)家的英文名也稱為AVL樹。本文介紹了它的原理和如何用C++代碼來實現(xiàn)
    2021-06-06
  • C語言實現(xiàn)商品管理系統(tǒng)開發(fā)

    C語言實現(xiàn)商品管理系統(tǒng)開發(fā)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)商品管理系統(tǒng)開發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 深入剖析C語言中qsort函數(shù)的實現(xiàn)原理

    深入剖析C語言中qsort函數(shù)的實現(xiàn)原理

    這篇文章主要介紹了C語言中qsort函數(shù)的實現(xiàn)原理,本文將從回調(diào)函數(shù),qsort函數(shù)的應(yīng)用,qsort函數(shù)的實現(xiàn)原理三個方面進(jìn)行講解,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • C++實現(xiàn)LeetCode(65.驗證數(shù)字)

    C++實現(xiàn)LeetCode(65.驗證數(shù)字)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(65.驗證數(shù)字),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Ubuntu 20.04 下安裝配置 VScode 的 C/C++ 開發(fā)環(huán)境(圖文教程)

    Ubuntu 20.04 下安裝配置 VScode 的 C/C++ 開發(fā)環(huán)境(圖文教程)

    這篇文章主要介紹了Ubuntu 20.04 下安裝配置 VScode 的 C/C++ 開發(fā)環(huán)境,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • C語言實現(xiàn)靜態(tài)順序表的實例詳解

    C語言實現(xiàn)靜態(tài)順序表的實例詳解

    這篇文章主要介紹了C語言實現(xiàn)靜態(tài)順序表的實例詳解的相關(guān)資料,這里提供是幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08

最新評論

大洼县| 朝阳市| 凤冈县| 明溪县| 开原市| 苍梧县| 洛扎县| 徐水县| 钟山县| 太湖县| 松原市| 涟水县| 米易县| 田林县| 襄城县| 措勤县| 沐川县| 台安县| 苏尼特左旗| 辉南县| 吐鲁番市| 兰考县| 云南省| 肃宁县| 松阳县| 炎陵县| 德保县| 象山县| 龙泉市| 莆田市| 张家港市| 南皮县| 梁平县| 岳普湖县| 招远市| 称多县| 崇州市| 尖扎县| 涿州市| 临桂县| 海丰县|