函式
<cstdio>

setbuf

void setbuf ( FILE * stream, char * buffer );
設定流緩衝區
指定要用於 I/O 操作的所使用的緩衝區,使其成為一個全緩衝流。或者,如果緩衝區是一個空指標,則停用該的緩衝,使其成為一個無緩衝流。

此函式應在與開啟的檔案關聯之後,但在對其執行任何輸入或輸出操作之前呼叫。

緩衝區的大小假定至少為 BUFSIZ 位元組(請參閱 setvbuf 以指定緩衝區的大小)。

流緩衝區是一塊資料,作為 I/O 操作和與流關聯的物理檔案之間的中介:對於輸出緩衝區,資料被輸出到緩衝區,直到達到其最大容量,然後它被重新整理(即:所有資料一次性發送到物理檔案並清空緩衝區)。同樣,輸入緩衝區從物理檔案中填充,資料從緩衝區傳送到操作,直到耗盡,此時會從檔案中獲取新資料再次填充緩衝區。

流緩衝區可以透過呼叫 fflush 來顯式重新整理。它們也會被 fclosefreopen 自動重新整理,或者在程式正常終止時自動重新整理。

一個全緩衝流在有足夠資料可用時,會使用整個緩衝區大小作為緩衝區(有關其他緩衝模式,請參閱 setvbuf)。

如果已知檔案不指向互動式裝置,則所有檔案在開啟時都會分配一個預設的緩衝區(全緩衝)。此函式可用於設定一個特定的記憶體塊作為緩衝區,或停用該流的緩衝。

預設情況下,如果已知標準流 stdinstdout 不指向互動式裝置,它們是全緩衝的。否則,它們可能是行緩衝無緩衝的,具體取決於系統和庫的實現。stderr 也是如此,它預設總是行緩衝無緩衝的。

呼叫此函式等效於使用以下引數呼叫 setvbuf_IOFBF作為 modeBUFSIZ 作為 size(當 buffer 不是空指標時),或者等效於使用以下引數呼叫它:_IONBF作為 mode(當 buffer 是空指標時)。

引數

stream
指向一個 FILE 物件的指標,該物件標識一個開啟的流。
buffer
使用者分配的緩衝區。長度應至少為 BUFSIZ 位元組。
或者,可以指定一個空指標來停用緩衝。

返回值

無。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* setbuf example */
#include <stdio.h>

int main ()
{
  char buffer[BUFSIZ];
  FILE *pFile1, *pFile2;

  pFile1=fopen ("myfile1.txt","w");
  pFile2=fopen ("myfile2.txt","a");

  setbuf ( pFile1 , buffer );
  fputs ("This is sent to a buffered stream",pFile1);
  fflush (pFile1);

  setbuf ( pFile2 , NULL );
  fputs ("This is sent to an unbuffered stream",pFile2);

  fclose (pFile1);
  fclose (pFile2);

  return 0;
}

在此示例中,打開了兩個檔案進行寫入。與檔案myfile1.txt關聯的流被設定為使用者分配的緩衝區;對其執行寫入操作;資料在邏輯上是流的一部分,但在呼叫 fflush 函式之前尚未寫入裝置。
示例中的第二個緩衝區與檔案myfile2.txt關聯,被設定為無緩衝,因此後續的輸出操作會盡快寫入裝置。
然而,一旦檔案被關閉(關閉檔案會重新整理其緩衝區),無論是有緩衝還是無緩衝的流,最終狀態都是相同的。

另見