FOPEN(3) | FreeBSD Library Functions Manual | FOPEN(3) |
名称
fopen, fdopen, freopen, fmemopen — ストリームオープン関数ライブラリ
Standard C Library (libc, -lc)書式
#include < stdio.h> FILE *
fopen( const char * restrict path, const char * restrict mode);
FILE *
fdopen( int fildes, const char *mode);
FILE *
freopen( const char *path, const char *mode, FILE *stream);
FILE *
fmemopen( void *restrict *buf, size_t size, const char * restrict mode);
解説
fopen() 関数は、 path によって指される文字列の名前のファイルをオープンし、ストリームをそれに関連付けます。引数 mode は、次の文字の 1 をで始まる文字列を指します:
-
“
r
” - 読み込みのためにオープンします。ストリームは、ファイルの先頭に位置付けられます。ファイルが存在しないなら、失敗します。
-
“
w
” - 書き込みのためにオープンします。ストリームは、ファイルの先頭に位置付けられます。ファイルが存在しないなら、作成されます。
-
“
a
” - 書き込みのためにオープンします。ストリームは、ファイルの最後に位置付けられます。それに続くファイルへの書き込みは、任意に介在する fseek(3) または類似のものに関係なく、常に、そのときの最新のファイルの終りで終了します。ファイルが存在しないなら、作成されます。
オプションの“ +
”が続く“ r
”, “ w
”または“ a
”は、読み込みと書き込みの両方のためにファイルをオープンします。オプションの“ x
”が続く“ w
”または“ w+
”によって、 fopen() 呼び出しは、ファイルが既に存在するなら、失敗します。上記に続くオプションの“ e
”によって、 fopen() 呼び出しは、基本的なファイル記述子で FD_CLOEXEC フラグを設定することができます。
また、 mode 文字列は、“ +
”または最初の文字のいずれかの後に文字“ b
”を含むことができます。これは、完全に ISO/IEC 9899:1990 (“ISO C90”) との互換性のためであり、 fmemopen() のためだけに効果があります。そうでなければ、``b'' は、無視されます。
任意の作成されたファイルには、プロセスの umask 値 ( umask(2) を参照) によって修正される、モード“ S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH” ( 0666
) があります。
読み込みと書き込みを、任意の順序で読み込みと書き込みのストリームを混ぜ合わせることができ、 stdio の以前バージョンでのように仲介するシーク (seek) 必要としません。しかしながら、これは、他のシステムへの移植性がありません。 ANSI C は、入力操作がファイルの終りに出合わなければ、ファイルの位置付け関数が出力と入力の間に入ることを必要とします。
fdopen() 関数は、ストリームを既存のファイル記述子 fildes に関連付けます。ストリームのモードは、ファイル記述子のモードと互換性がなければなりません。“ x
”モードオプションは、無視されます。“ e
”モードオプションが存在するなら、 FD_CLOEXEC フラグが設定され、そうでなければ、変わらないままとなります。ストリームが fclose(3) によってクローズされるとき、 fildes もクローズされます。
freopen() 関数は、 path によって指される文字列の名前のファイルをオープンし、 stream によって指されるストリームをそれに関連付けます。元のストリームは、(存在するなら) クローズされます。 mode 引数は、ちょうど fopen() 関数のように使用されます。
path 引数が NULL であるなら、 freopen() は、新しいモードで stream に関連しているファイルを再オープンすることを試みます。新しいモードは、ストリームが次のようのオープンされた元のモードと互換性がなければなりません: 読み込みのためにオープンされたストリームは、読み込みのためだけに再オープンすることができ、書き込みのためにオープンされたストリームは、書き込みのためだけに再オープンすることができ、そして読み込みと書き込みのためにオープンされたストリームは、任意のモードで再オープンすることができます。“ x
”モードのオプションは、このコンテキストにおいて意味がありません。
freopen() 関数の主な使用は、標準テキストストリーム ( stderr, stdin または stdout) に関連したファイルを変更することです。
fmemopen() 関数は、ストリームで buf と size 引数によって与えられたバッファに関連付けます。 buf 引数は、NULL ポインタまたは少なくとも size バイトであるバッファへのポインタのいずれかです。 NULL ポインタが buf 引数として指定されるなら、 fmemopen() は、 size バイトをメモリを割り付けるます。このバッファは、ストリームがクローズされるとき、自動的に解放されます。テキストモード (デフォルト) または (``b'' が mode 引数の 2 番目または 3 番目の位置に存在するなら) バイナリモードでバッファをオープンすることができます。テキストモードでオープンされたバッファは、最後の書き込みがすべてのバッファを満たしていないなら、書き込みがヌルバイトで終了していることを確認してください。バイナリモードでオープンされたバッファは、決してヌルバイトを追加しません。
戻り値
成功して終了すると、 fopen(), fdopen() と freopen() は、 FILE ポインタを返します。そうでなければ、 NULL が返され、グローバル変数 errno にエラーを示す値が設定されます。エラー
- [ EINVAL]
- fopen(), fdopen(), freopen() または fmemopen() への mode 引数が無効でした。
また fopen(), fdopen(), freopen() と fmemopen() 関数が、失敗し、ルーチン malloc(3) で明記されたエラーのいずれかが errno に設定されます。
また fopen() 関数は、失敗し、ルーチン open(2) で明記されたエラーのいずれかが errno に設定されます。
また fdopen() 関数は、失敗し、ルーチン fcntl(2) で明記されたエラーのいずれかが errno に設定されます。
また freopen() 関数は、失敗し、ルーチン open(2), fclose(3) と fflush(3) で明記されたエラーのいずれかが errno に設定されます。
規格
fopen() と freopen() 関数は、 ISO/IEC 9899:2011 (“ISO C11”) に適合する“x
”モードオプションを除いて、 ISO/IEC 9899:1990 (“ISO C90”) に適合しています。
fdopen() 関数は、 IEEE Std 1003.1-1988 (“POSIX.1”) に適合しています。“
e
”モードオプションは、どんな規格にも適合しませんが、glibc によってもサポートされています。
fmemopen() 関数は、 IEEE Std 1003.1-2008 (“POSIX.1”) に適合しています。 ``b'' モードは、どんな規格にも適合しませんが、glibc によってもサポートされています。
January 30, 2013 | FreeBSD |