この関数の目的
fopen()は、ファイルを開く。
定義
#include <stdio.h> FILE *fopen(const char *filename, const char *mode);
働き
この関数は filename 文字列で指定されるファイルを開き、ストリームに関連付ける。
mode は以下のいずれかで始まる文字列を指す。
r | テキストファイルの読み込み |
w | 長さ0にするか、新しいテキストファイルを作って書き込む |
a | 開くか、新しいテキストファイルを作って最後に追加書き込み |
rb | バイナリファイルの読み込み |
wb | 長さ0にするか、新しいバイナリファイルを作って書き込む |
ab | 開くか、新しいバイナリファイルを作って最後に追加書き込み |
r+ | テキストファイルの更新 |
w+ | 長さ0にするか、新しいテキストファイルを作って更新 |
a+ | 開くか、新しいテキストファイルを作って最後から更新 |
r+bまたはrb+ | バイナリファイルの更新 |
w+bまたはwb+ | 長さ0にするか、新しいファイルをバイナリファイルを作って更新 |
a+bまたはab+ | 開くか、新しいバイナリファイルを作って最後から更新 |
ファイルが存在しないか、読めない場合、読み込みモード(mode の最初の文字が'r')でのオープンは失敗する。
追加モード(mode の最初の文字が'a')で開いたファイルへの書き込みは、 fseek() の使用に関わらず常にファイルの最後(end-of-file)である。 処理系によっては、バイナリファイルを追加モードで開くと(mode の2番目か3番目の文字が'b')、 ヌル文字の詰め物のために最後のデータより後に書き込み位置が置かれるかもしれない。
ファイルを更新モードで開いたとき(mode の2番目か3番目の文字が'+')、入力も出力も関係したストリームに対して行うことができる。 ただし、出力の直後の入力は fflush() またはファイル位置調整関数( fseek() 、 fsetpos() 、 rewind() )が間に呼ばれる必要がある。 また、入力の直後の出力は入力がファイルの最後に達したのでない限りファイル位置調整関数が間に呼ばれる必要がある。 更新モードでテキストファイルを開く(作る)と、処理系によってはバイナリのストリームを開く(作る)ことになるかもしれない。
ストリームが開かれたときには、通信装置に関連しないと考えられるときにのみ、完全にバッファされている。 ストリームのエラーと EOF のインジゲータはセットされない。
この関数はストリームを操作するオブジェクトへのポインタを返す。オープンに失敗した場合、ヌルポインタを返す。
解説
処理系によっては上の表に含まれない文字列を mode に認めるものがあるが、それは他の処理系でも通用するとは保証されないことに注意せよ。 また、この文字列は最初に表の中のどれかと同じ文字列があればいいのであって、 意味のない文字列が後ろに続いていたとしても無視されるという点も知っておくに値するだろう。
ターミナルへの出力など、ファイルとの入出力でなければ、バッファは行われない。 バッファについては fflush() を参照のこと。