Manpages

名 前

fopen, fdopen, freopen − ス ト リ ー ム を 開 く 関 数

書 式

#include <stdio.h>

FILE *fopen(const char *path, const char *mode);

FILE *fdopen(int fd, const char *mode);

FILE *freopen(const char *path, const char *mode, FILE *stream);

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):

fdopen(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE

説 明

fopen() 関 数 は 、 path で 指 定 さ れ た 名 前 の フ ァ イ ル を 開 き 、 ス ト リ ー ム と 結 び つ け る 。 引 数 mode は 、 以 下 に 続 く 文 字 の ひ と つ か ら 始 ま る 文 字 列 へ の ポ イ ン タ ー で あ る (以 下 の 述 べ る 、 追 加 の 文 字 が 後 に 続 く こ と も あ る ):

r テ キ ス ト フ ァ イ ル を 読 み 出 す た め に 開 く 。 ス ト リ ー ム は フ ァ イ ル の 先 頭 に 位 置 さ れ る 。

r+ 読 み 出 し お よ び 書 き 込 み す る た め に 開 く 。 ス ト リ ー ム は フ ァ イ ル の 先 頭 に 位 置 さ れ る 。

w フ ァ イ ル を 書 き 込 み の た め に 開 く 。 フ ァ イ ル が 既 に 存 在 す る 場 合 に は 長 さ ゼ ロ に 切 り 詰 め る 。 フ ァ イ ル が な か っ た 場 合 に は 新 た に 作 成 す る 。 ス ト リ ー ム は フ ァ イ ル の 先 頭 に 位 置 さ れ る 。

w+ 読 み 出 し お よ び 書 き 込 み の た め に 開 く 。 フ ァ イ ル が 存 在 し て い な い 場 合 に は 新 た に 作 成 す る 。 存 在 し て い る 場 合 に は 長 さ ゼ ロ に 切 り 詰 め ら れ る 。 ス ト リ ー ム は フ ァ イ ル の 先 頭 に 位 置 さ れ る 。

a 追 加

(フ ァ イ ル の 最 後 に 書 き 込 む ) の た め に 開 く 。 フ ァ イ ル が 存 在 し て い な い 場 合 に は 新 た に 作 成 す る 。 ス ト リ ー ム は フ ァ イ ル の 最 後 に 位 置 さ れ る 。

a+ 読 み 出 し お よ び 追 加

(フ ァ イ ル の 最 後 に 書 き 込 む ) の た め に 開 く 。

フ ァ イ ル が 存 在 し て い な い 場 合 に は 新 た に 作 成 す る 。 読 み 出 し の 初 期 フ ァ イ ル 位 置 は フ ァ イ ル の 先 頭 で あ る が 、 書 き 込 み は 常 に フ ァ イ ル の 最 後 に 追 加 さ れ る 。

mode 文 字 列 に は 文 字 'b' を 追 加 指 定 す る こ と が で き 、 mode 文 字 列 の 最 後 の 文 字 と し て 指 定 す る 。 上 記 の う ち 2 文 字 の モ ー ド の 場 合 に は 2 つ の 文 字 の 間 に 指 定 す る こ と も で き る 。 こ れ は C89 と の 互 換 性 の た め だ け に 用 意 さ れ た も の で あ り 、 関 数 の 実 行 に 対 し て は い か な る 影 響 も 持 た な い 。 す な わ ち 、 Linux を 含 む 全 て の POSIX 準 拠 シ ス テ ム で は 、 こ の 'b' は 無 視 さ れ る 。 (そ の 他 の シ ス テ ム で は テ キ ス ト フ ァ イ ル と バ イ ナ リ フ ァ イ ル を 別 々 に 扱 う も の も あ る の で 、 も し バ イ ナ リ フ ァ イ ル の 入 出 力 を 行 い 、 そ の プ ロ グ ラ ム が 非 UNIX 環 境 へ 移 植 さ れ る と 予 測 す る な ら 、 'b'を 付 け て お く の は 良 い 考 え で あ る )

mode の glibc に よ る 拡 張 の 詳 細 に つ い て は 下 記 の 「 注 意 」 を 参 照 。 す べ て の 生 成 さ れ た フ ァ イ ル は 、 S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH (0666) の モ ー ド を そ の プ ロ セ ス の umask 値 に よ っ て 修 正 し た モ ー ド を 持 つ (umask(2) を 見 よ )。 読 み 出 し /書 き 込 み ス ト リ ー ム に 対 し て は 任 意 の 順 序 で 読 み 書 き を 行 う こ と が で き る 。 た だ し ANSI C で は 、 (入 力 操 作 が フ ァ イ ル の 末 尾 に 到 達 し た 場 合 を 除 い て ) 出 力 と 入 力 の 間 に は フ ァ イ ル の 位 置 決 め 関 数 を 挟 ま な け れ ば な ら な い こ と に な っ て い る こ と に 注 意 さ れ た い (こ の 条 件 を 満 足 し な い 場 合 に は 、 読 み 込 み 操 作 は 、 最 後 に 書 き 込 ま れ た も の で な く 、 以 前 に 書 き 込 ま れ た 値 を 返 す こ と を 許 さ れ て い る )。 し た が っ て 、 こ の よ う な ス ト リ ー ム で の 読 み 書 き 操 作 の 間 に は fseek(3) ま た は fgetpos(3) 操 作 を 挟 ん で お く と 良 い だ ろ う (Linux で は 本 当 に 必 要 と な る こ と も と き ど き あ る )。 こ の 操 作 は 見 か け 上 何 も し な い 操 作 (no−op) で も 良 い (例 え ば fseek(..., 0L, SEEK_CUR) を そ の 副 次 的 効 果 で あ る 同 期 の た め だ け に 呼 べ ば 良 い )。 フ ァ イ ル を 追 加 モ ー ド (mode の 最 初 の 文 字 を a に す る ) で 開 く と 、 こ の ス ト リ ー ム に 対 す る 書 き 込 み 操 作 は 全 て (先 に 以 下 の 呼 び 出 し を 行 っ た か の よ う に ) フ ァ イ ル の 末 尾 で 行 わ れ る 。

fseek(stream, 0, SEEK_END);

fdopen() 関 数 は 、 既 存 の フ ァ イ ル デ ィ ス ク リ プ タ ー fd に ス ト リ ー ム を 結 び つ け る 。 ス ト リ ー ム の mode ("r", "r+", "w", "w+", "a", "a+" の い ず れ か ) は フ ァ イ ル デ ィ ス ク リ プ タ ー の モ ー ド と 互 換 の も の で な け れ ば な ら な い 。 新 し い ス ト リ ー ム の フ ァ イ ル 位 置 指 示 子 は fd に 属 し て い る 値 に 設 定 さ れ る 。 error と end−of−file の 各 指 示 子 は ク リ ア さ れ る 。 "w" お よ び "w+" モ ー ド で の フ ァ イ ル の 切 り 詰 め は 行 わ れ な い 。 フ ァ イ ル デ ィ ス ク リ プ タ ー の 複 製 は 行 な わ れ な い 。 fdopen() で 作 成 さ れ た ス ト リ ー ム が 閉 じ ら れ た と き に フ ァ イ ル デ ィ ス ク リ プ タ ー も 閉 じ ら れ る 。 共 有 メ モ リ ー の オ ブ ジ ェ ク ト へ fdopen() を 行 っ た と き の 結 果 は 定 義 さ れ て い な い 。

freopen() 関 数 は path で 名 前 が 指 定 さ れ た フ ァ イ ル を 開 き 、 stream で 指 定 さ れ た ス ト リ ー ム に 、 そ の フ ァ イ ル を 結 び つ け る 。 も と の ス ト リ ー ム は (も し 存 在 す る 場 合 に は ) 閉 じ ら れ る 。 mode 引 数 は fopen() 関 数 と 同 じ 形 で 使 わ れ る 。 freopen() 関 数 の 主 な 用 途 は 、 標 準 テ キ ス ト ス ト リ ー ム (stderr, stdin, stdout) と 対 応 付 け ら れ て い る フ ァ イ ル を 変 更 す る こ と で あ る 。

返 り 値

fopen(), fdopen(), freopen() は 成 功 す る と FILE 型 の ポ イ ン タ ー を 返 す 。 失 敗 す る と NULL が 返 さ れ 、 errno が エ ラ ー を 示 す 値 に セ ッ ト さ れ る 。

エ ラ ー

EINVAL

fopen(), fdopen(), freopen() で 与 え ら れ た mode が 不 適 切 で あ る 。

fopen(), fdopen(), freopen() 関 数 は malloc(3) ル ー チ ン で 規 定 さ れ て い る エ ラ ー で も 失 敗 す る こ と が あ り 、 そ の 時 は 対 応 す る 値 に errno を セ ッ ト す る 。

fopen() 関 数 は open(2) ル ー チ ン で 規 定 さ れ て い る エ ラ ー で も 失 敗 す る こ と が あ り 、 そ の 時 は 対 応 す る 値 に errno を セ ッ ト す る 。

fdopen() 関 数 は fcntl(2) ル ー チ ン で 規 定 さ れ て い る エ ラ ー で も 失 敗 す る こ と が あ り 、 そ の 時 は 対 応 す る 値 に errno を セ ッ ト す る 。

freopen() 関 数 は open(2), fclose(3), fflush(3) 各 ル ー チ ン で 規 定 さ れ て い る エ ラ ー で も 失 敗 す る こ と が あ り 、 そ の 時 は 対 応 す る 値 に errno を セ ッ ト す る 。

準 拠

fopen() 関 数 と freopen() 関 数 は C89に 準 拠 し て い る 。 fdopen() 関 数 は POSIX.1−1990 に 準 拠 し て い る 。

注 意

glibc で の 注 意
GNU C ラ イ ブ ラ リ で は 、 mode に 指 定 で き る 文 字 列 と し て 、 以 下 の 拡 張 が 行 わ れ て い る :
c
(glibc 2.3.3 以 降 )

open 操 作 、 そ れ に 続 く read/write 操 作 の 、 ス レ ッ ド の 取 り 消 し ポ イ ン ト (cancellation points) を 作 成 し な い 。 こ の フ ラ グ は fdopen() で は 無 視 さ れ る 。

e (glibc 2.7 以 降 )

O_CLOEXEC フ ラ グ を 有 効 に し て フ ァ イ ル を オ ー プ ン す る 。 詳 細 は open(2) を 参 照 。 こ の フ ラ グ は fdopen() で は 無 視 さ れ る 。

m (glibc 2.3 以 降 )

I/O シ ス テ ム コ ー ル (read(2), write(2)) で は な く 、 mmap(2) を 使 っ て フ ァ イ ル に ア ク セ ス し よ う と す る 。 mmap(2) を 使 お う と す る の は 、 読 み 出 し 用 に オ ー プ ン す る フ ァ イ ル に つ い て だ け で あ る 。

x フ ァ イ ル を 排 他 的 に オ ー プ ン す る

(open(2) の O_EXCL フ ラ グ と 同

様 )。 フ ァ イ ル が す で に 存 在 す る 場 合 、 fopen() は 失 敗 し 、 errnoEEXIST が セ ッ ト さ れ る 。 こ の フ ラ グ は fdopen() で は 無 視 さ れ る 。 上 記 の 文 字 に 加 え て 、 fopen() と freopen() で は mode に 以 下 の 書 式 を 指 定 す る こ と が で き る 。 ,ccs=string 指 定 さ れ た string は 、 符 号 化 文 字 集 合 の 名 前 と 解 釈 さ れ 、 ス ト リ ー ム で は ワ イ ド 文 字 の ス ト リ ー ム と し て 扱 わ れ る 。 内 部 変 換 関 数 で 入 出 力 時 に 文 字 集 合 string と の 変 換 が 行 わ れ る 。 書 式 ,ccs=string が 指 定 さ れ な い 場 合 は 、 ス ト リ ー ム を ワ イ ド 文 字 の ス ト リ ー ム と し て 扱 う か は 最 初 の フ ァ イ ル 操 作 時 に 決 定 さ れ る 。 最 初 の フ ァ イ ル 操 作 が ワ イ ド 文 字 操 作 で あ っ た 場 合 は 、 そ の ス ト リ ー ム は ワ イ ド 文 字 の ス ト リ ー ム と し て 扱 わ れ 、 符 号 化 文 字 集 合 と の 変 換 を 行 う 関 数 が 読 み 込 ま れ る 。

バ グ

mode の 個 々 の フ ラ グ 文 字 ("ccs" 指 定 の 前 の 文 字 ) を 解 釈 す る 際 に 、 glibc の fopen() と freopen() の 実 装 で は 、 mode の 確 認 を 最 大 7 文 字 し か 行 わ な い と い う 制 限 が あ る (バ ー ジ ョ ン 2.14 よ り 前 の glibc で は 最 大 6 文 字 だ が 、 6 文 字 で は "rb+cmxe" な ど の 指 定 を 行 う に は 不 十 分 で あ っ た )。 fdopen() の 現 在 の 実 装 で は 最 大 5 文 字 の mode し か 解 釈 さ れ な い 。

関 連 項 目

open(2), fclose(3), fileno(3), fmemopen(3), fopencookie(3)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。