SETBUF(3) Linux Programmer's Manual SETBUF(3)

setbuf, setbuffer, setlinebuf, setvbuf - 流緩衝操作

#include <stdio.h>

void setbuf(FILE *stream, char *buf);
void setbuffer(FILE *stream, char *buf, size_t size);
void setlinebuf(FILE *stream);
int setvbuf(FILE *stream, char *buf, int mode , size_t size);

有三種類型的緩衝策略,它們是無緩衝,塊緩衝和行緩衝。當輸出流無緩衝時,資訊在寫的同時出現於目標檔案或終端上;當是塊緩衝時,字元被暫存,然後一起寫入;當是行緩衝時,字元被暫存,直到要輸出一個新行符,或者從任何與終端裝置連線的流中 (典型的是 stdin) 讀取輸入時才輸出。函式 fflush(3) 可以用來強制提前輸出。(參見 fclose(3)) 通常所有檔案都是塊緩衝的。當檔案 I/O 操作在檔案上發生時,將呼叫 malloc(3) ,獲得一個緩衝。如果流指向一個終端 (通常 stdout 都是這樣),那麼它是行緩衝的。標準錯誤流 stderr 預設總是無緩衝的。

函式 setvbuf 可以用在任何開啟的流上,改變它的緩衝。引數 mode 必須是下列三個宏之一:

_IONBF
無緩衝
_IOLBF
行緩衝
_IOFBF
完全緩衝

除非是無緩衝的檔案,否則引數 buf 應當指向一個長度至少為 size 位元組的緩衝;這個緩衝將取代當前的緩衝。如果引數 bufNULL ,只有這個模式會受到影響;下次 read 或 write 操作還將分配一個新的緩衝。函式 setvbuf 只能在開啟一個流,還未對它進行任何其他操作之前使用。

其他三個函式呼叫是函式 setvbuf 的別名,函式 setbuf 與使用下列語句完全等價:

setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);

函式 setbuffer 與此相同,但是緩衝的長度由使用者決定,而不是由預設值 BUFSIZ 決定。函式 setlinebuf 與使用下列語句完全等價:

setvbuf(stream, (char *)NULL, _IOLBF, 0);

函式 setvbuf 成功執行時返回 0。它失敗時可能返回任何值,但是當 It can return any value on failure, but returns nonzero when mode 不正確,或者不能實現請求時,必須返回非零值。它在失敗時可能設定 errno 。其他函式沒有返回值。

函式 setbufsetvbuf 遵循 ANSI X3.159-1989 (``ANSI C'') 標準。

函式 setbuffersetlinebuf 無法移植到 4.2BSD 之前的 BSD 版本,在 Linux 中僅在 libc 4.5.21 之後的系統中可用。在 4.2BSD 和 4.3BSD 系統中, setbuf 總是使用非最優的緩衝大小,應當避免使用它。

stream 被關閉時,必須確保 buf 和它指向的空間仍然存在。這通常發生在程式終止時。

例如,下列呼叫是非法的:

#include <stdio.h>
int main()
{
    char buf[BUFSIZ];
    setbuf(stdin, buf);
    printf("Hello, world!\n");
    return 0;
}

fclose(3), fflush(3), fopen(3), fread(3), malloc(3), printf(3), puts(3)

本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh

2001-06-09 Linux