函式
<cstdio>

setvbuf

int setvbuf ( FILE * stream, char * buffer, int mode, size_t size );
更改流的緩衝
stream指定一個buffer。該函式允許指定緩衝區的模式大小(以位元組為單位)。

如果buffer為null指標,則函式會自動分配一個緩衝區(使用size作為緩衝區大小的提示)。否則,buffer指向的陣列可用作一個大小為size位元組的緩衝區。

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

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

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

所有檔案都預設分配了緩衝區(全緩衝),前提是它們不指向互動式裝置。此函式可用於重新定義緩衝區大小模式,定義使用者分配的緩衝區,或停用流的緩衝。

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


引數

stream
指向一個FILE物件,該物件標識一個已開啟的流。
buffer
使用者分配的緩衝區。至少應有size位元組長。
如果設定為null指標,則函式會自動分配緩衝區。
mode
指定檔案緩衝模式。三個特殊的宏常量(_IOFBF, _IOLBF_IONBF)在<cstdio>中定義,用作此引數的值
_IOFBF全緩衝:輸出時,一旦緩衝區已滿(或重新整理),資料就會被寫入。輸入時,當請求輸入操作且緩衝區為空時,緩衝區將被填充。
_IOLBF行緩衝:輸出時,當向流中插入一個換行符或緩衝區已滿(或重新整理)時,資料就會被寫入,以先發生的為準。輸入時,當請求輸入操作且緩衝區為空時,緩衝區會被填充直到下一個換行符。
_IONBF無緩衝:不使用緩衝區。每個 I/O 操作會盡快寫入。在這種情況下,buffersize引數將被忽略。
size
緩衝區大小,以位元組為單位。
如果buffer引數是null指標,此值可能決定函式為緩衝區自動分配的大小。

返回值

如果緩衝區已成功分配給檔案,則返回零。
否則,返回一個非零值;這可能是由於mode引數無效,或者由於分配或分配緩衝區時出現其他錯誤。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* setvbuf example */
#include <stdio.h>

int main ()
{
  FILE *pFile;

  pFile=fopen ("myfile.txt","w");

  setvbuf ( pFile , NULL , _IOFBF , 1024 );

  // File operations here

  fclose (pFile);

  return 0;
}

在此示例中,一個名為myfile.txt的檔案被建立,併為關聯的流請求了1024位元組的全緩衝,因此輸出到此流的資料應在每次1024位元組緩衝區填滿時才寫入檔案。

另見