FOPEN(3)

名前
fopen, fdopen, freopen - ストリームを開く関数

書式
#include <stdio.h>

FILE *fopen( char *path, char *mode);
FILE *fdopen( int fildes, char *mode);
FILE *freopen( char *path, char *mode, FILE *stream);

説明
fopen 関数は、 path で名前が指定されているファイルを開きストリームに連結する。

引数 mode は、以下に続く文字のひとつから始まる文字列のポインタである。 (追加の文字がこの文字の後に続くこともできる):

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

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

w   もとのファイルを長さゼロに切り取る。 または、書き込むためにテキストファイルを新たに作成する。 ストリームはファイルの先頭に位置される。

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

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

a+  読み取りおよび書き込み(更新)のために開く。 ファイルが存在していない場合には新たに作成する。 ストリームはファイルの最後に位置される。

mode 文字列は、第3の文字としても、または上述のどの2文字の文字列の間にも、 文字``b''を含むことができる。 これは、ANSI C3.159-1989 (``ANSI C'')との互換性のための厳密性であり、関数の 実行に対してどのような影響も持たない。 すなわち、この``b''は無視される。

すべての生成されたファイルは、 そのプロセスによってumask値が修正されたかのように S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH (0666) のモードを持つ。( umask(2) を見よ)

read/writeストリームに対しては任意の順序で読み書きを行うことができる。 入力操作が end-of-file に到達しない間は ファイル位置決め関数が入出力間に介在することを、 ANSI Cが要請していることに注意をしてほしい。 (この状態が満たされていないと、読み込みは、 最も新しい書き出し以外の結果を返すことを許してしまう。) それゆえ、このようなストリームでの読み書き操作の間に fseek または fgetpos 操作を置いてみることは良い習慣である。 (そして、実際に Linux では時々必要となる) この操作は、( fseek(..., 0L, SEEK_CUR) が同調のために使われるように) 見かけ上は何もしない操作(no-op)になるかもしれない。

fdopen 関数は、既存のファイルディスクリプター fildes にストリームを結びつける。 このストリームの mode は、結びつけたいファイルディスクリプターのモードと互換性がなければならない。 このとき、ファイルディスクリプターは複製されない。

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 をセットする。

関連項目
open(2), fclose(3)

準拠
fopen 関数と freopen 関数は ANSI C3.159-1989 (``ANSI C'')に準拠する。 fdopen 関数は IEEE Std1003.1-1988 (``POSIX.1'')に準拠する。