西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)編程開(kāi)發(fā)VC|VC++ → C語(yǔ)言中g(shù)etchar函數(shù)的緩存機(jī)制

C語(yǔ)言中g(shù)etchar函數(shù)的緩存機(jī)制

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2012/12/11 8:37:13字體大小:A-A+

作者:西西點(diǎn)擊:88次評(píng)論:0次標(biāo)簽: 緩存

緩存視頻合并器v1.5.0最新版
  • 類(lèi)型:影音播放大。8.9M語(yǔ)言:中文 評(píng)分:10.0
  • 標(biāo)簽:
立即下載

與緩存區(qū)相關(guān)最常見(jiàn)的操作就是字符的輸入與輸出操作getchar,getc,getch,getche,gets系列函數(shù)。
第一個(gè)例子(與getchar有關(guān)):

代碼如上,當(dāng)輸入一個(gè)字符按下回車(chē)后程序沒(méi)有等待你二次輸入就結(jié)束了,而且無(wú)論輸入什么運(yùn)行結(jié)果均是10,是不是很奇怪(反正我第一次遇到時(shí)感覺(jué)是很奇怪),更奇怪的是當(dāng)你一次性輸入多個(gè)字符如abcd結(jié)果又正確的打印出了98,為什么呢?這就是緩沖區(qū)的原因。
解釋如下:getchar定義在stdio.h文件中,我們?cè)趕tdio.h中可以找到其相關(guān)的定義:

#define getchar()         getc(stdin)//即getchar等同于調(diào)用getc(stdin)

我們又找到getc的定義

#define getc(_stream)     (--(_stream)->_cnt >= 0 \                ? 0xff & *(_stream)->_ptr++ : _filbuf(_stream))

將其展開(kāi)即得:

if(--(stdin)->_cnt>=0)       return 0xff&*(stdin)->ptr++;                   else                         return filbuf(stdin);

代碼譯如下stdin是標(biāo)準(zhǔn)輸入流,查看MSDN與stdio.h中可以看到定義如下:

MSDN:

FILEstructure
Stores information about current state of stream; used in all stream I/O operations.
STDIO.H

Stdio.h中:

#define stdin  (&_iob[0])

跟蹤即可得:

_CRTIMP extern FILE _iob[];

從上面代碼可得_iob是FILE結(jié)構(gòu)類(lèi)型的,查看stdio.h中可以看到FILE結(jié)構(gòu)體定義如下:

從FILE結(jié)構(gòu)中我們可以得到了上面getc宏定義中使用的_cnt,_ptr成員,但這些都是次要的,我們應(yīng)該不難發(fā)現(xiàn)有這樣幾個(gè)成員_bufsize,_base分別對(duì)應(yīng)的是緩沖區(qū)大小,緩沖區(qū)基地址,從這里得到一個(gè)顯而意見(jiàn)的結(jié)論就是getchar函數(shù)使用了緩沖機(jī)制。(_cnt對(duì)應(yīng)的是緩沖區(qū)的輸入的字節(jié)數(shù)目,_ptr對(duì)應(yīng)的是讀指針的位置)

getc宏定義詳解

--(stdin)->_cnt>=0此句判斷是否緩沖區(qū)內(nèi)有數(shù)據(jù),有的話就減一(表示又讀了一個(gè)),并讀取數(shù)據(jù)return 0xff&*(stdin)->ptr++,讀完成后,將讀指針向前移一個(gè)位置【重要】

好了,講了這么多都是鋪墊,現(xiàn)在回到正題為什么會(huì)出現(xiàn)上述結(jié)果:)

出現(xiàn)上述結(jié)果追根結(jié)底還是由于getchar函數(shù)使用了緩沖(看了上面的,我想大家也知道了,確實(shí)使用了緩沖),當(dāng)輸入一個(gè)字符按下回車(chē)后程序沒(méi)有等待你二次輸入就結(jié)束了,而且無(wú)論輸入什么運(yùn)行結(jié)果均是10,這是因?yàn)楫?dāng)用戶輸入了一個(gè)字符后,并按下回車(chē)后,緩沖中會(huì)存入用戶輸入的字符以及換行鍵的ASCII碼(10 ~)【略去的回車(chē)的ASCII碼13,可能是為了跨平臺(tái),在Linux下,回車(chē)后就是換行10,Windows下回車(chē)是先回車(chē)回到首行,再換行,即13 10】(執(zhí)行第一次getchar實(shí)際上是執(zhí)行g(shù)etc的else語(yǔ)句,填充緩存區(qū)后_cnt=2,_prt指向0位置,執(zhí)行完后_cnt=1,_prt指向1位置),第二次執(zhí)行g(shù)etchar時(shí),調(diào)用getc不會(huì)再執(zhí)行else語(yǔ)句,執(zhí)行的是if語(yǔ)句,故第二次不再等待用戶輸入了,直接執(zhí)行,執(zhí)行后cnt=0,prt指向位置2,并返回ptr指向位置1時(shí)的結(jié)果,即10,由于10為換行鍵,當(dāng)執(zhí)行遇到此時(shí),會(huì)在執(zhí)行完后清空緩存,ptr重新指向了位置0,cnt=0。

當(dāng)輸入abcd的時(shí)候分析一樣,只不過(guò)掃行了第二個(gè)getchar后,cnt=2,ptr指向了位置2。

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門(mén)評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)