Manpages

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 字 節 的 緩

衝 ; 這 個 緩 衝 將 取 代 當 前 的 緩 衝 。 如 果 參 數 bufNULL , 只 有 這 個 模 式 會 受 到 影 響 ; 下 次 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 標 準 參 考

函 數 setbufsetvbuf 遵 循 ANSI X3.159-1989 (’’ANSI C’’) 標 準 。

BUGS

函 數 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; }

SEE ALSO 參 見

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

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