PHP入門 | テキストファイルの利用 | fopenによるファイルアクセス

file()によるファイル読み込みよりも柔軟な処理が必要な場合は、PHPが提供する基本的なファイルアクセス関数を組み合わせて利用できる。ファイルアクセスは3つの手順で行う。

1. ファイルを開く

$変数 = fopen(ファイル指定, モード指定);

まずfopenという関数を呼び出す。これは引数で指定されたファイルを開き、そのファイルにアクセスするための「ファイルポインタ」を返す。ファイルにアクセスする場合は、必ずこのfopenでファイルを開く。

2番目の引数にある「モード指定」がfopenの重要な点である。これはそのファイルへのアクセス形式を指定する。アクセスモードは、そのファイルをどのように扱うか、どのようなアクセスを許可するかを設定するものだ。モードは次の記号で指定する。

fopenのモードを指定する記号

引数 モード ポインタ位置 ファイルが存在する場合
r 読み込み専用 ファイルの先頭 ファイル内容を保持
r+ 読み書き ファイルの先頭 ファイル内容を保持
w 書き込み専用 ファイルの先頭 内容を削除し、なければ新規作成
w+ 読み書き ファイルの先頭 内容を削除し、なければ新規作成
a 書き込み専用 ファイルの末尾 内容を保持し、なければ新規作成
a+ 読み書き ファイルの末尾 内容を保持し、なければ新規作成
x 書き込み専用 新しいファイルを作成 存在する場合はfalseを返しエラーになる
x+ 読み書き 新しいファイルを作成 存在する場合はfalseを返しエラーになる
  • 上のモード引数の末尾にはbまたはtを付けられる。
    • b: バイナリモードで開く。
    • t: テキストファイルの改行を変換する。Unixでは\n、古いMacでは\rのみ、Windowsでは\r\nを使うため、\n\r\nへ変換する。他のシステムのテキストファイルをWindowsプラットフォームで開く場合に便利である。

2. データにアクセスする

ファイルを開いたら、次に必要なデータを読み込んだり、データを書き込んだりする。ここではfgetsfputsという関数が用意されている。それぞれについては後で説明する。

3. ファイルを閉じる

fclose(ファイルポインタ);

データアクセスが完了したら、最後にファイルを閉じる。これはfcloseという関数で行う。引数にはfopenで取得したファイルポインタを指定する。

なぜfopenでファイルを開き、fcloseで閉じる必要があるのだろうか。それは、この操作によってファイルへのアクセス権が制御されるからである。通常、コンピュータのアプリケーションでファイルを使用している場合、他のアプリケーションから開けなかったり、削除できなかったりする。これは「このアプリケーションが使用中である」ことを示し、他のプログラムからアクセスできないようにしているためだ。

もし複数のプログラムが同時にファイルへアクセスできると、内容が予期しない形で書き換えられる可能性がある。そのため、ファイルに書かれたデータが壊れないように「一度にファイルを使用できるのは1つのアプリケーションだけ」となっている。

fopenfcloseも同じ役割を果たしている。fopenでファイルを開くと、他のプログラムが勝手にそのファイルを開いて内容を書き換えられなくなる。そしてすべての作業後にfcloseを実行してファイルを閉じ、解放することで、他のプログラムがそのファイルを使えるようになる。