SETBUF(3)

NAME
setbuf, setbuffer, setlinebuf, setvbuf - 流緩沖操作

SYNOPSIS 總覽
#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);

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

函數 setvbuf 可以用在任何打開的流上，改變它的緩沖。參數 mode 必須是下列三個宏之一：

    _IONBF
        無緩沖

    _IOLBF
        行緩沖

    _IOFBF
        完全緩沖

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

其他三個函數調用是函數 setvbuf 的別名，函數 setbuf 與使用下列語句完全等價：

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

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

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

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

CONFORMING TO 標準參考
函數 setbuf 和 setvbuf 遵循 ANSI X3.159-1989 (``ANSI C'') 標準。

BUGS
函數 setbuffer 和 setlinebuf 無法移植到 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;
}

SEE ALSO 參見
fclose(3), fflush(3), fopen(3), fread(3), malloc(3), printf(3), puts(3)