對比C語言中的setbuf()函數和setvbuf()函數的使用_C 語言

來源:互聯網
上載者:User

C語言setbuf()函數:把緩衝區與流相關聯
標頭檔:

#include <stdio.h>

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

void setbuf(FILE * stream, char * buf);

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


如果參數buf 為NULL 指標,則為無緩衝,setbuf()相當於調用setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZE)。

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

【執行個體】觀察緩衝區與流關聯後的影響。

#include <stdio.h> char outbuf[BUFSIZ]; int main(void) {   setbuf(stdout, outbuf); // 把緩衝區與流相連  puts("This is a test of buffered output.\n");  puts(outbuf);  fflush(stdout); // 重新整理  puts(outbuf); // 輸出  return 0; }

輸出結果:

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,則又輸出兩個字串。

C語言setvbuf()函數:設定檔案流的緩衝區
標頭檔:

 #include <stdio.h>

函數setvbuf()用來設定檔案流的緩衝區,其原型為:

  int setvbuf(FILE * stream, char * buf, int type, unsigned size);

【參數】stream為檔案流指標,buf為緩衝區首地址,type為緩衝區類型,size為緩衝區內位元組的數量。

參數類型type說明如下:

  • _IOFBF (滿緩衝):當緩衝區為空白時,從流讀入資料。或當緩衝區滿時,向流寫入資料。
  • _IOLBF (行緩衝):每次從流中讀入一行資料或向流中寫入—行資料。
  • _IONBF (無緩衝):直接從流中讀入資料或直接向流中寫入資料,而沒有緩衝區。

【傳回值】成功返回0,失敗返回非0。

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

如果您只是想簡單的操作緩衝區,還可以使用setbuf()函數,請查看:C語言setbuf()函數

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

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

【執行個體】為檔案設定特殊類型緩衝區。

#include <stdio.h> int main(void) {   FILE *input, *output;   char bufr[512];   input = fopen("file.in", "w+");   /*開啟檔案*/  output = fopen("file.out", "w");  if (setvbuf(input, bufr, _IOFBF, 512) != 0) /*失敗*/  {   printf("failed to set up buffer for input file\n");  }  else   {   printf("buffer set up for input file\n"); }  if (setvbuf(output, NULL, _IOLBF, 132) != 0) /*為流指定特殊的緩衝區*/  {   printf("failed to set up buffer for output file\n"); }  else   {   printf("buffer set up for output file\n");   }  fclose(input);   fclose(output);   return 0; }

運行結果:

Buffer set up for input fileBuffer set up for output file

程式先開啟兩個檔案,分別設定緩衝區,根據傳回值判定是否成功,最後使用fclose函數關閉這兩個檔案。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.