名前
fopen, fdopen, freopen - ストリームを開く関数書式
#include <stdio.h>
FILE *fopen(const char *pathname, const char *mode);
FILE *fdopen(int fd, const char *mode);
FILE *freopen(const char *pathname, const char *mode, FILE *stream);
glibc
向けの機能検査マクロの要件
( feature_test_macros(7) 参照):
fdopen(): _POSIX_C_SOURCE
説明
fopen() 関数は、 pathname で指定された名前のファイルを開き、ストリームと結びつける。 引数 mode は、以下に続く文字のひとつから始まる文字列へのポインターであ る (以下の述べる、追加の文字が後に続くこともある):- r
- テキストファイルを読み出すために開く。 ストリームはファイルの先頭に位置される。
- r+
- 読み出しおよび書き込みするために開く。 ストリームはファイルの先頭に位置される。
- w
- ファイルを書き込みのために開く。 ファイルが既に存在する場合には長さゼロに切り詰める。 ファイルがなかった場合には新たに作成する。 ストリームはファイルの先頭に位置される。
- w+
- 読み出しおよび書き込みのために開く。 ファイルが存在していない場合には新たに作成する。 存在している場合には長さゼロに切り詰められる。 ストリームはファイルの先頭に位置される。
- a
- 追加 (ファイルの最後に書き込む) のために開く。 ファイルが存在していない場合には新たに作成する。 ストリームはファイルの最後に位置される。
- a+
- Open for reading and appending (writing at end of file). The file is created if it does not exist. Output is always appended to the end of the file. POSIX is silent on what the initial read position is when using this mode. For glibc, the initial file position for reading is at the beginning of the file, but for Android/BSD/MacOS, the initial file position for reading is at the end of the file.
fseek(stream, 0, SEEK_END);
The file descriptor associated with the stream is opened as if by a call to open(2) with the following flags:
fopen() モード | open() フラグ |
r | O_RDONLY |
w | O_WRONLY | O_CREAT | O_TRUNC |
a | O_WRONLY | O_CREAT | O_APPEND |
r+ | O_RDWR |
w+ | O_RDWR | O_CREAT | O_TRUNC |
a+ | O_RDWR | O_CREAT | O_APPEND |
fdopen()
fdopen() 関数は、既存のファイルディスクリプター fd にストリームを結びつける。 ストリームの mode ("r", "r+", "w", "w+", "a", "a+" のいずれか) は ファイルディスクリプターのモードと互換のものでなければならない。 新しいストリームのファイル位置指示子は fd に属している値に設定される。 error と end-of-file の各指示子はクリアされる。 "w" および "w+" モードでのファイルの切り詰めは行われない。 ファイルディスクリプターの複製は行なわれない。 fdopen() で作成されたストリームが閉じられたときにファイルディスクリプターも 閉じられる。 共有メモリーのオブジェクトへ fdopen() を行ったときの結果は定義されていない。freopen()
freopen() 関数は path で名前が指定されたファイルを開き、 stream で指定されたストリームに、そのファイルを結びつける。 もとのストリームは (もし存在する場合には) 閉じられる。 mode 引数は fopen() 関数と同じ形で使われる。 If the pathname argument is a null pointer, freopen() changes the mode of the stream to that specified in mode; that is, freopen() reopens the pathname that is associated with the stream. The specification for this behavior was added in the C99 standard, which says:In this case, the file descriptor associated
with the stream need not be closed if the call to freopen() succeeds.
It is implementation-defined which changes of mode are permitted (if any), and
under what circumstances.
freopen()
関数の主な用途は、標準テキストストリーム
( stderr, stdin, stdout)
と対応付けられているファイルを変更することである。
返り値
fopen(), fdopen(), freopen() は成功すると FILE 型のポインターを返す。 失敗すると NULL が返され、 errno がエラーを示す値にセットされる。エラー
- EINVAL
- fopen(), fdopen(), freopen() で与えられた mode が不適切である。
属性
この節で使用されている用語の説明については、 attributes(7) を参照。インターフェース | 属性 | 値 |
fopen(), fdopen(), freopen() | Thread safety | MT-Safe |
準拠
fopen(), freopen(): POSIX.1-2001, POSIX.1-2008, C89, C99. fdopen(): POSIX.1-2001, POSIX.1-2008.注意
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() は失敗し、 errno に EEXIST がセットされる。 このフラグは fdopen() では無視される。
バグ
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), open_memstream(3)この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。2020-12-21 | GNU |