setbuf函式 詳解

2021-06-04 10:43:05 字數 1166 閱讀 6282

程式輸出有兩種方式:一種是即時處理方式,另一種是先暫存起來,然後再大塊寫入的方式,前者往往造成較高的系統負擔。因此,c語言實現通常都允許程式設計師進行實際的寫操作之前控制產生的輸出資料量。

這種控制能力一般是通過庫函式setbuf實現的。如果buf是乙個大小適當的字元陣列,那麼:

setbuf(stdout,buf);

語句將通知輸入/輸出庫,所有寫入到stdout的輸出都應該使用buf作為輸出緩衝區,直到buf緩衝區被填滿或者程式設計師直接呼叫fflush(譯註:對於由寫操作開啟的檔案,呼叫fflush將導致輸出緩衝區的內容被實際地寫入該檔案),buf緩衝區中的內容才實際寫入到stdout中。緩衝區的大小由系統標頭檔案中的bufsiz定義。

下面的程式的作用是把標準輸入的內容複製到標準輸出中,演示了setbuf庫函式最顯而易見的用法:

#include

main()

int c;

char buf[bufsiz];

setbuf(stdout, buf);

while((c=getchar())!=eof)

putchar(c);

遺憾的是,這個程式是錯誤的,僅僅是因為乙個細微的原因。程式中對庫函式setbuf的呼叫,通知了輸入/輸出庫所有字元的標準輸出應該首先快取在buf中。要找到問題出自何處,我們不妨思考一下buf緩衝區最後一次被清空是在什麼時候?答案是在main函式結束之後,作為程式交回控制給作業系統之前c執行時庫所必須進行的清理工作的一部分。但是,在此之前buf字元陣列已經被釋放!

要避免這種型別的錯誤有兩種辦法。第一種辦法是讓緩衝陣列成為靜態陣列,既可以直接顯式宣告buf為靜態:

static char buf[bufsiz];

也可以把buf宣告完全移到main函式之外。第二種辦法是動態分配緩衝區,在程式中並不主動釋放分配的緩衝區(譯註:山於緩衝區是動態分配的,所以main函式結束時並不會釋放該緩衝區,這樣c執行時庫進行清理工作時就不會發生緩衝區已釋放的情況):

char *malloc();

setbuf(stdout,malloc(bufsiz));

如果讀者關心一些程式設計「小技巧」,也許會注意到這裡其實並不需要檢查malloc函式呼叫是否成功。如果malloc函式呼叫失敗,將返回乙個null指標。setbuf函式的第二個引數取值可以為null,此時標準輸出不需要進行緩衝。這種情況下,程式仍然能夠工作,只不過速度較慢而已。

setbuf函式使用注意點

程式輸出有兩種方式 一種是即時處理方式,另一種是先暫存起來,然後再大塊寫入的方式,前者往往造成較高的系統負擔。因此,c語言實現通常都允許程式設計師進行實際的寫操作之前控制產生的輸出資料量。這種控制能力一般是通過庫函式setbuf實現的。如果buf是乙個大小適當的字元陣列,那麼 setbuf stdo...

setbuf使用細節

include int main return 0 setbuf stdout,buf 之後的每一次使用putchar函式在呼叫fflush函式就把該字元寫到buf中,等main函式返回後就把快取裡面的東西列印出來。include int main return 0 當更改fflush函式的位置後,...

setbuf關閉流緩衝

開啟和關閉緩衝機制。功 能 把緩衝區與流相聯 用 法 void setbuf file steam,char buf 說明 setbuf函式具有開啟和關閉緩衝機制。為了帶緩衝進行i o,引數buf必須指向乙個長度為bufsiz 定義在stdio.h標頭檔案中 的緩衝區。通常在此之後該流就是全緩衝的,...