名称
fopen(), freopen(), fdopen() ― ストリームファイルのオープン、再オープン、ファイルからストリームへの変換
構文
#include <stdio.h>
FILE *fopen(const char *pathname, const char *type);
FILE *freopen(const char *pathname, const char *type,
FILE *stream);
FILE *fdopen(int fildes, const char *type);
説明
| fopen() | | pathname で示されるファイルをオープンし、 stream と結び付けます。 fopen() は stream と結び付いた FILE 構造体 を指すポインターを返します。 |
| freopen() | | オープンされている stream を、指定したファイルで置き換えます。 オープンが成功するかどうかにかかわりなく、元の stream はクローズされます。 freopen() は stream と結び付いた FILE 構造体を指すポインターを返し、 clearerr() ferror(3S) を参照) を暗黙のうちに呼び出します。 freopen() 呼び出しが成功すると stream の指向性はクリヤされます (orientation(5) を参照)。 freopen() は通常、 stdin、 stdout、
および stderr といった、あらかじめオープンされている streams を、他のファイルに結び付けるのに使用されます。 |
| fdopen() | | ストリームをファイル記述子に結び付けます。 ファイル記述子は open()、 dup()、 creat()、
あるいは pipe() open(2)、 dup(2)、 creat(2)、 および pipe(2) 参照) から得られるもので、これらの関数はファイルをオープンしますが、 FILE 構造体ストリームを指すポインターは返しません。
ストリームは (3S) セクションのライブラリルーチンのほとんどで、入力として必要となります。
ストリームの type は開いているファイルのモードと一致しなければなりません。 fdopen() 呼び出しで使用される type の意味は前述のとおりですが、 w、 w+、 wb、
および wb+ はファイルの大きさをゼロにしません。 |
| pathname | | オープンするファイルの名前を持った文字列を指します。 |
| type | | 以下のいずれかの値を 1 つ含む文字列 以下の値で b を指定しても無効になります。 b は、バイナリファイルとテキストファイルを区別するために指定しますが、UNIX
システムで使用されるファイルでは、このような区別はありません (ISO
C 規格準拠の場合に必要になります)。 | r または rb | | 読み取り用のファイルを開きます。 | | w または wb | | 書き込みのために大きさをゼロにする、あるいは書き込み用ファイルの新規作成 | | a または ab | | 追加。ファイルの最後に書き込む、あるいは書き込み用ファイルの新規作成 | | r+、rb+、または r+b | | アップデートするファイルのオープン (読み取りおよび書き込み) | | w+、wb+、または w+b | | 書き込みのためにバイナリファイルの大きさをゼロにする、あるいはアップデート用ファイルの新規作成 | | a+、ab+、または a+b | | 追加。アップデートするファイルを、ファイルの終わりでオープンまたは作成 |
|
ファイルをアップデートのためにオープンした場合、その stream に対しては入力、出力とも可能です。 しかし、出力に続いて入力を行う場合には、その間で fflush() を呼び出すか、ファイルの位置を操作する関数
(fseek()、 fsetpos()、 あるいは rewind())
を呼び出さなければなりません。 入力に続いて出力を行う場合には、その間で、ファイルの位置を操作する関数を呼び出さなければなりません。入力がファイルの終端マークに達した場合は別です。
ファイルを追加のためにオープンした場合 type が a、 a+、 ab+、
または a+b)、 の場合)、ファイルのすでにある内容にオーバーライトすることはできません。
途中で fseek() を呼び出しても、すべての出力はファイルの最後に書き込まれます。
2 つの別のプロセスが同じファイルを追加のためにオープンした場合、それぞれのプロセスは自由にファイルに書き込むことができます。一方の書き込みが他方により壊されることはありません。
2 つのプロセスの出力は、書き込みを行った順番にファイル内で混ぜ合わされます。
注記
HP-UX ではバイナリモードのファイルとバイナリでないモードのファイルは types です。 たとえば、 r と rb は
同じです。
戻り値
正常終了すると、 fopen()、 fdopen() および freopen() は、ストリームを指す FILE * ポインターを返します。
失敗すると null ポインターを返し、エラーを示す値を errno に設定します。
エラー
fopen()、 fdopen()、
および freopen() は、以下の条件のとき失敗します。
| EINVAL | | type 引き数が無効なモードの場合 |
| ENOMEM | | バッファーを確保するのに十分な領域がない場合 |
fopen() および freopen() は以下の条件のとき失敗します。
| EACCES | | パスプリフィックスの構成要素の検索パーミッションが拒否された場合、
ファイルが存在して type で指定したパーミッションが拒否された場合、 ファイルが存在しないときに、ファイルを作成する親ディレクトリの書き込みパーミッションが拒否された場合 |
| EINTR | | fopen() あるいは freopen() 関数の中でシグナルを受け取った場合 |
| EISDIR | | 指定したファイルがディレクトリで、 type が書き込みアクセス要求の場合 |
| EMFILE | | 呼び出すプロセスが、制限を超えてファイルをオープンしようとした場合 |
| ENAMETOOLONG | | pathname 文字列の長さが PATH_MAX を超えているか、あるいは POSIX_NO_TRUNC が有効なときに、パス名の構成要素が NAME_MAX より長い場合 |
| ENFILE | | システム ファイルテーブルが一杯の場合 |
| ENOENT | | 指定したファイルが存在しないか パス名 引き数が空の文字列を指している場合 |
| ENOSPC | | ディレクトリあるいはファイルシステムに新しくファイルを作成する領域がない場合 |
| ENOTDIR | | パスプリフィックスの構成要素がディレクトリでない場合 |
| ENXIO | | 指定したファイルが文字型スペシャルファイルかブロック型スペシャルファイルであり、スペシャルファイルに接続されたデバイスがない場合 |
| EOVERFLOW | | 指定したファイルが通常ファイルであり、この環境において
ファイルのサイズが off_t のサイズの変数で正しく示されない場合 |
| EROFS | | 指定したファイルが読み取り専用ファイルシステムにあり、 type が書き込みアクセス要求の場合 |
fopen() および freopen() の中で呼び出される open() 関数により、この他の値が errno に設定されることがあります open(2) 参照)。
参照
creat(2), dup(2), open(2), pipe(2), fclose(3S), fgetpos64(3S),
fseek(3S), popen(3S), setbuf(3S), orientation(5), thread_safety(5)
標準準拠
fopen(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C
fdopen(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1
freopen(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C