程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> GetChar緩存機制深刻分析

GetChar緩存機制深刻分析

編輯:關於C++

GetChar緩存機制深刻分析。本站提示廣大學習愛好者:(GetChar緩存機制深刻分析)文章只能為提供參考,不一定能成為您想要的結果。以下是GetChar緩存機制深刻分析正文


與緩存區相干最多見的操作就是字符的輸出與輸入操作getchar,getc,getch,getche,gets系列函數。

第一個例子(與getchar有關):

#include<stdio.h> 
int main() 

    int ch; 
    ch=getchar(); 
    ch=getchar(); 
    printf("%d\n",ch); 
    return 0; 


代碼如上,當輸出一個字符按下回車後法式沒有期待你二次輸出就停止了,並且不管輸出甚麼運轉成果均是10,是否是很奇異(橫豎我第一次碰到時感到是很奇異),更奇異的是當你一次性輸出多個字符如abcd成果又准確的打印出了98,為何呢?這就是緩沖區的緣由。

說明以下:getchar界說在stdio.h文件中,我們在stdio.h中可以找到其相干的界說:

#define getchar()         getc(stdin)//即getchar同等於挪用getc(stdin)

我們又找到getc的界說

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

將其睜開即得:

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


else 
        return filbuf(stdin); 

代碼譯以下stdin是尺度輸出流,檢查MSDN與stdio.h中可以看到界說以下:

Stdio.h中:

#define stdin  (&_iob[0]) 

跟蹤便可得:

_CRTIMP extern FILE _iob[]; 

從下面代碼可得_iob是FILE構造類型的,檢查stdio.h中可以看到FILE構造體界說以下:

struct _iobuf { 
        char *_ptr; 
        int   _cnt; 
        char *_base; 
        int   _flag; 
        int   _file; 
        int   _charbuf; 
        int   _bufsiz; 
        char *_tmpfname; 
        }; 


從FILE構造中我們可以獲得了下面getc宏界說中應用的_cnt,_ptr成員,但這些都是主要的,我們應當不難發明有如許幾個成員_bufsize,_base分離對應的是緩沖區年夜小,緩沖區基地址,從這裡獲得一個顯而看法的結論就是getchar函數應用了緩沖機制。(_cnt對應的是緩沖區的輸出的字節數量,_ptr對應的是讀指針的地位)

getc宏界說詳解

--(stdin)->_cnt>=0 

此句斷定能否緩沖區內稀有據,有的話就減一(表現又讀了一個),並讀取數據return 0xff&*(stdin)->ptr++,讀完成後,將讀指針向前移一個地位【主要】

好了,講了這麼多都是鋪墊,如今回到正題為何會湧現上述成果:)

湧現上述成果追根結底照樣因為getchar函數應用了緩沖(看了下面的,我想年夜家也曉得了,確切應用了緩沖),當輸出一個字符按下回車後法式沒有期待你二次輸出就停止了,並且不管輸出甚麼運轉成果均是10,這是由於當用戶輸出了一個字符後,並按下回車後,緩沖中會存入用戶輸出的字符和換行鍵的ASCII碼(10 ~)【略去的回車的ASCII碼13,能夠是為了跨平台,在Linux下,回車後就是換行10,Windows下回車是先回車回到首行,再換行,即13 10】(履行第一次getchar現實上是履行getc的else語句,填充緩存區後_cnt=2,_prt指向0地位,履行完後_cnt=1,_prt指向1地位),第二次履行getchar時,挪用getc不會再履行else語句,履行的是if語句,故第二次不再期待用戶輸出了,直接履行,履行後cnt=0,prt指向地位2,並前往ptr指向地位1時的成果,即10,因為10為換行鍵,當履行碰到此時,會在履行完後清空緩存,ptr從新指向了地位0,cnt=0。

當輸出abc的時刻剖析一樣,只不外掃行了第二個getchar後,cnt=2,ptr指向了地位2。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved