<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                在C語言中,用一個指針變量指向一個文件,這個指針稱為文件指針。通過文件指針就可對它所指的文件進行各種操作。 定義文件指針的一般形式為: ~~~ FILE *fp; ~~~ 這里的FILE,實際上是在stdio.h中定義的一個結構體,該結構體中含有文件名、文件狀態和文件當前位置等信息,fopen 返回的就是FILE類型的指針。 注意:FILE是文件緩沖區的結構,fp也是指向文件緩沖區的指針。 不同編譯器 stdio.h 頭文件中對 FILE 的定義略有差異,這里以標準C舉例說明: ~~~ typedef struct _iobuf { int cnt; // 剩余的字符,如果是輸入緩沖區,那么就表示緩沖區中還有多少個字符未被讀取 char *ptr; // 下一個要被讀取的字符的地址 char *base; // 緩沖區基地址 int flag; // 讀寫狀態標志位 int fd; // 文件描述符 // 其他成員 } FILE; ~~~ 下面說一下如果控制緩沖區。 我們知道,當我們從鍵盤輸入數據的時候,數據并不是直接被我們得到,而是放在了緩沖區中,然后我們從緩沖區中得到我們想要的數據 。如果我們通過setbuf()或setvbuf()函數將緩沖區設置10個字節的大小,而我們從鍵盤輸入了20個字節大小的數據,這樣我們輸入的前10個數據會放在緩沖區中,因為我們設置的緩沖區的大小只能夠裝下10個字節大小的數據,裝不下20個字節大小的數據。那么剩下的那10個字節大小的數據怎么辦呢?暫時放在了輸入流中。請看下圖: ![](https://box.kancloud.cn/d11020f6a35c22c1bd295fce35a3d880_278x90.png) 上面的箭頭表示的區域就相當是一個輸入流,紅色的地方相當于一個開關,這個開關可以控制往深綠色區域(標注的是緩沖區)里放進去的數據,輸入20個字節的數據只往緩沖區中放進去了10個字節,剩下的10個字節的數據就被停留在了輸入流里!等待下去往緩沖區中放入!接下來系統是如何來控制這個緩沖區呢? 再說一下 FILE 結構體中幾個相關成員的含義: ? ? cnt ?// 剩余的字符,如果是輸入緩沖區,那么就表示緩沖區中還有多少個字符未被讀取 ? ? ptr ?// 下一個要被讀取的字符的地址 ? ? base ?// 緩沖區基地址 在上面我們向緩沖區中放入了10個字節大小的數據,FILE結構體中的 cnt 變為了10 ,說明此時緩沖區中有10個字節大小的數據可以讀,同時我們假設緩沖區的基地址也就是 base 是0x00428e60 ,它是不變的 ,而此時 ptr 的值也為0x00428e60 ,表示從0x00428e60這個位置開始讀取數據,當我們從緩沖區中讀取5個數據的時候,cnt 變為了5 ,表示緩沖區還有5個數據可以讀,ptr 則變為了0x0042e865表示下次應該從這個位置開始讀取緩沖區中的數據 ,如果接下來我們再讀取5個數據的時候,cnt 則變為了0 ,表示緩沖區中已經沒有任何數據了,ptr 變為了0x0042869表示下次應該從這個位置開始從緩沖區中讀取數據,但是此時緩沖區中已經沒有任何數據了,所以要將輸入流中的剩下的那10個數據放進來,這樣緩沖區中又有了10個數據,此時 cnt 變為了10 ,注意了剛才我們講到 ptr 的值是0x00428e69 ,而當緩沖區中重新放進來數據的時候這個 ptr 的值變為了0x00428e60 ,這是因為當緩沖區中沒有任何數據的時候要將 ptr 這個值進行一下刷新,使其指向緩沖區的基地址也就是0x0042e860這個值!因為下次要從這個位置開始讀取數據! 在這里有點需要說明:當我們從鍵盤輸入字符串的時候需要敲一下回車鍵才能夠將這個字符串送入到緩沖區中,那么敲入的這個回車鍵(\\r)會被轉換為一個換行符\\n,這個換行符\\n也會被存儲在緩沖區中并且被當成一個字符來計算!比如我們在鍵盤上敲下了123456這個字符串,然后敲一下回車鍵(\\r)將這個字符串送入了緩沖區中,那么此時緩沖區中的字節個數是7 ,而不是6。 緩沖區的刷新就是將指針 ptr 變為緩沖區的基地址 ,同時 cnt 的值變為0 ,因為緩沖區刷新后里面是沒有數據的!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看