PHPプログラミング

最終更新日:
公開日:

レシピ

ファイル / ディレクトリ

fopen関数でファイルの読み込み/書き込みを行う

fopen関数を使ってファイルを読み込みと書き込みを行う方法について解説します。

この記事のポイント

  • PHPでファイルを開く操作はfopen関数を使う
  • fopen関数はオプションを使って読み込むモードを指定する
  • ファイルの先頭から1行ずつテキストを読み込んだり、ファイルにテキストを追記することができる

目次

ファイル操作で便利なfopen関数

fopen関数を使うと、指定したパスのファイルを開いてアクセスできる状態にすることができます。

PHP コード例

fopen('./test/data.txt', 'r');

第1パラメータはファイルへのパスを指定し、第2パラメータは「読み込み」「書き込み」などのモードを指定します。

ファイルを開くことに成功したらファイルポインターリソース(ファイルハンドラとも呼ぶことがあります)を返し、失敗した場合にはfalseを返します。
ファイルポインターリソースはアクセスするファイルの目印となるもので、変数に保持してfgets関数fwrite関数などのファイルを操作する関数に渡して使用します。

fopen関数のモードには次のような値を指定することができます。

意味ファイルポインタファイルが存在しない場合の挙動
rファイルを読み込みモードで開きます。先頭エラー
r+ファイルを読み込み/書き込みモードで開きます。先頭エラー
wファイルを書き込みモードで開きます。ファイルを開いた時点で一度リセットします。先頭新しく作成
w+ファイルを読み込み/書き込みモードで開きます。ファイルを開いた時点で一度リセットします。先頭新しく作成
aファイルを書き込みモードで開きます。ファイルをリセットせずに追記します。末尾新しく作成
a+ファイルを読み込み/書き込みモードで開きます。ファイルをリセットせずに追記します。末尾新しく作成
xファイルを書き込みモードで開きます。ファイルが存在しない場合のみファイルを開くことができ、すでに同名のファイルが存在する場合は失敗します。先頭新しく作成
x+ファイルを読み込み/書き込みモードで開きます。ファイルが存在しない場合のみファイルを開くことができ、すでに同名のファイルが存在する場合は失敗します。先頭新しく作成
cファイルを書き込みモードで開きます。ファイルがすでに存在する場合においても内容はリセットせず、先頭から書き込みます。先頭新しく作成
c+ファイルを読み込み/書き込みモードで開きます。ファイルがすでに存在する場合においても内容はリセットせず、先頭から書き込みます。先頭新しく作成
eオープンされたファイル記述子に close-on-exec フラグを設定します。エラー

特殊な「e」を除き、大きく分けて「r」「w」「a」「x」「c」の5つのモードがあります。
さらに「r」と「r+」のように2種類が用意されています。

まず、もっともシンプルで分かりやすいのは「r」モードで、こちらは純粋に読み込みのみを行います。
r+」は書き込みも行えるモードで、先頭から追記を行うことができます。
この2つはファイルがすでに存在する場合のみファイルを開くことができ、存在しない場合はエラーとなります。

それ以外のモードは基本的に書き込みを目的としており、どのような形でファイルへの書き込みを行うかで用途が分かれます。
大まかには、ファイルを新しく作成する「w」「x」、追記(編集)をする「a」「c」と分けることができます。

w」「w+」はファイルの中身を一旦リセットしてから書き込みを行うことが特徴で、ファイルの新規作成と同じ動作をします。
x」「x+」は新規でファイルを作成する場合のみ使用することができ、すでに同名のファイルが存在していたらエラーが起こり書き込みを行いません。
つまり、「w」「w+」の方が強制力のある動作です。

a」「a+」はファイルの最後から追記を行い、「c」「c+」は先頭から追記を行います。

ファイルの内容を読み込む

fopen関数でファイルからデータを読み込み、内容を出力していきます。
今回は次のようなテキストファイル「test.txt」を扱うこととして進めていきます。

test.txt

--------------------
Test file
--------------------

Line1
Line2
Line3
Line4
Line5

こちらのファイルを読み込んで、1行ずつ出力します。

PHP コード例

<?php

// ファイルを開く
$file_handle = fopen('test.txt', 'r');

// ファイル内容を1行ずつ読み込んで出力
while( $file_line = fgets( $file_handle) ) {
  echo nl2br($file_line);
}

// ファイルを閉じる
fclose($file_handle);

fopen関数で「test.txt」を開き、$file_handleにファイルポインターリソースを保持します。
その後、fgets関数で1行ずつファイルの内容を読み込んで出力し、全てが出力し終わったらfclose関数でファイルへのアクセスを閉じて終了です。

ファイルにテキストを追記する

fopen関数でファイルを書き込みモードで開き、先頭にテキストを追記します。
使用するテキストファイルは上記と同じ「test.txt」を使用し、以下のコードではこちらのファイルを読み込んで1行ずつ出力します。

PHP コード例

<?php

// 変数の初期化
$file_handle = null;
$contents = null;

// ファイルを開く
$file_handle = fopen('test.txt', 'r+');

// ファイルを1行ずつ取得
while( $file_line = fgets( $file_handle) ) {
  $contents .= $file_line;
}

// ファイルポインタを先頭に戻す
rewind($file_handle);

// 先頭に更新時間を記述する
$contents = "最終更新日時:".date('Y-m-d H:i:s')."\n" . $contents;

// 書き込み
fwrite( $file_handle, $contents);

// ファイルへのアクセスを閉じる
fclose( $file_handle);

fopen関数で「test.txt」を開き、$file_handleにファイルポインターリソースを保持します。
続いてwhile文で1行ずつファイルの内容を読み込み、rewind関数でファイルポインタを先頭に戻しています。

そして$contentsの先頭に「最終更新日時」と現在の日時を追記し、fwrite関数でファイルにテキストを書き込みを行うという流れです。

このコードを実行すると、テキストファイルは次のように更新されます。

test.txt

最終更新日時:2018-12-18 17:01:44
--------------------
Test file
--------------------

Line1
Line2
Line3
Line4
Line5

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

コメントありがとうございます!
運営の参考にさせていただきます。