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

COMMENTS