C語言setbuf()函式:把緩衝區與流相關聯

2puT發表於2016-07-14
標頭檔案:#include <stdio.h>

函式setbuf()用於將指定緩衝區與特定的檔案流相關聯,實現操作緩衝區時直接操作檔案流的功能。其原型如下:
    void setbuf(FILE * stream, char * buf);

【引數】stream為檔案流指標,buf為緩衝區的起始地址。

該函式涉及流和緩衝區的知識,請參考C語言流和緩衝區(快取)專題。

如果引數buf 為NULL 指標,則為無緩衝,setbuf()相當於呼叫setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZE),請參考C語言setvbuf()函式

setbuf()和setvbuf()函式的實際意義在於:使用者開啟一個檔案後,可以建立自己的檔案緩衝區,而不必使用fopen()函式開啟檔案時設定的預設緩衝區。這樣就可以讓使用者自己來控制緩衝區,包括改變緩衝區大小、定時重新整理緩衝區、改變緩衝區型別、刪除流中預設的緩衝區、為不帶緩衝區的流開闢緩衝區等。

說明:在開啟檔案流後,讀取內容之前,可以呼叫setbuf()來設定檔案流的緩衝區(而且必須是這樣)。

【例項】觀察緩衝區與流關聯後的影響。
  1. #include <stdio.h>
  2. char outbuf[BUFSIZ];
  3. int main(void)
  4. {
  5. setbuf(stdout, outbuf); // 把緩衝區與流相連
  6. puts("This is a test of buffered output.\n");
  7. puts(outbuf);
  8. fflush(stdout); // 重新整理
  9. puts(outbuf); // 輸出
  10. return 0;
  11. }
輸出結果:
This is a test of buffered output..
This is a test of buffered output..
This is a test of buffered output..
This is a test of buffered output..

程式先把outbuf與輸出流相連,然後輸出一個字串,這時因為緩衝區已經與流相連,所以outbuf中也儲存著這個字串,緊接著puts函式又輸出一遍,所以現在outbuf中儲存著兩個一樣的字串。重新整理輸出流之後,再次puts,則又輸出兩個字串。

相關文章