名 前
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);
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):
setbuffer(), setlinebuf(): _BSD_SOURCE
説 明
バ ッ フ ァ ー リ ン グ に は unbuffered, block buffered, line buffered の 3つ の タ イ プ が あ る 。 出 力 ス ト リ ー ム の タ イ プ が unbuffered の 場 合 、 デ ー タ を 書 き 込 む と す ぐ に 出 力 先 フ ァ イ ル に 書 き 込 ま れ る か タ ー ミ ナ ル に 表 示 さ れ る 。 block buffered の 場 合 、 文 字 の 読 み 書 き は ブ ロ ッ ク 単 位 で い っ ぺ ん に 行 わ れ る 。 line buffered の 場 合 、 新 し い 行 が 出 力 さ れ る か 、 タ ー ミ ナ ル デ バ イ ス に 接 続 し て い る ス ト リ ー ム (通 常 、 stdin) か ら 新 し い 行 が 入 力 さ れ る ま で 文 字 が た く わ え ら れ る 。 ブ ロ ッ ク を 強 制 的 に 出 力 す る に は fflush(3) 関 数 を 使 う 。 (fclose(3) を 参 照 の こ と ) 通 常 、 フ ァ イ ル は す べ て block buffered で あ る 。 フ ァ イ ル に 対 し て 初 め て 入 出 力 処 理 を 行 う と malloc(3) が 呼 び 出 さ れ バ ッ フ ァ ー が 獲 得 さ れ る 。 も し ス ト リ ー ム が (通 常 、 stdout が そ う で あ る よ う に ) タ ー ミ ナ ル を 参 照 す る 場 合 に は 、 フ ァ イ ル は line buffered と な る 。 標 準 エ ラ ー 出 力 stderr は デ フ ォ ル ト で は 常 に unbuffered で あ る 。
setvbuf() 関 数 は 、 オ ー プ ン し て い る 任 意 の ス ト リ ー ム に 対 し て バ ッ フ ァ ー を 変 更 で き る 。 引 き 数 mode は 、 次 の 3 つ の マ ク ロ の う ち い ず れ か で あ る :
_IONBF |
unbuffered |
|||
_IOLBF |
line buffered |
|||
_IOFBF |
fully buffered |
unbuffered の フ ァ イ ル を 除 き 、 buf 引 数 は size バ イ ト 以 上 の 大 き さ の バ ッ フ ァ ー を 指 し て い な け れ ば な ら な い 。 こ の バ ッ フ ァ ー は 現 在 の バ ッ フ ァ ー の 代 わ り に 用 い ら れ る 。 も し 、 引 数 buf が NULL な ら ば 、 モ ー ド だ け が 変 更 さ れ る 。 新 し い バ ッ フ ァ ー は 次 に 読 み 書 き し た 際 に 割 り 当 て ら れ る 。 setvbuf() 関 数 は 、 ス ト リ ー ム を オ ー プ ン し た 後 、 そ の ス ト リ ー ム に 対 し て 何 ら か の 操 作 を す る 前 に の み 使 用 で き る 。 他 の 3 つ の 関 数 は setvbuf() の 呼 び 出 し に 単 純 に 置 き 換 え る こ と が で き る 。 setbuf() 関 数 は 、
setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ); と 全 く 同 等 だ し 、 setbuffer() 関 数 は 、 バ ッ フ ァ ー サ イ ズ が デ フ ォ ル ト 値 BUFSIZ で は な く 引 数 で 与 え ら れ る 点 以 外 は 同 じ で あ る 。 setlinebuf() 関 数 は 以 下 と 同 じ で あ る 。
setvbuf(stream, NULL, _IOLBF, 0);
返 り 値
setvbuf() 関 数 は 、 成 功 し た 場 合 0 を 返 す 。 失 敗 し た 場 合 、 0 以 外 の 値 を 返 す (失 敗 と は 、 mode が 不 正 な 場 合 ま た は リ ク エ ス ト が 条 件 を 満 た さ な い 場 合 で あ る )。 setvbuf() 関 数 が 失 敗 し た 場 合 は errno を 設 定 す る こ と も あ る 。 そ の 他 の 関 数 は 値 を 返 さ な い 。
属 性
マ ル チ ス レ ッ デ ィ ン グ (pthreads(7) 参 照 ) 関 数 setbuf(), setbuffer(), setlinebuf(), setvbuf() は ス レ ッ ド セ ー フ で あ る 。
準 拠
setbuf() 関 数 お よ び setvbuf() 関 数 は C89 と C99 に 準 拠 し て い る 。
バ グ
stream を 閉 じ る 時 (プ ロ グ ラ ム を 終 了 す る 際 に も こ れ は 起 き る ) に は 、 buf が 指 し 示 す 空 間 と が 存 在 し て い る こ と を 保 証 し な け れ ば な ら な い 。 例 え ば 、 次 の よ う な 使 い 方 は 許 さ れ な い :
#include <stdio.h>
int
main(void)
{
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 ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。