C語言setbuf()函數:把緩衝區與流相關聯
標頭檔:
函數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()函數:設定檔案流的緩衝區
標頭檔:
函數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函數關閉這兩個檔案。