PHP - BASIC - 11. PHPのファイルシステムを扱う関数 - 6. ファイルの読み込み
これまでに file_get_contents
関数や file
関数によるファイルの読み込みについて学習してきました。ファイルの内容を1つの文字列データとして読み込むのであれば file_get_contents
関数、行単位で配列に変換したいのであれば file
関数を使うことができます。これらの関数は手軽に使えて便利ですが、ファイルサイズが大きい場合はその分メモリを消費してしまうことになるので注意が必要です。
プログラムの実行環境に依存しますが、ファイルサイズが数KB程度であれば
file_get_contents
関数やfile
関数を使っても問題ないでしょう。
読み込むファイルサイズが大きい場合や、ファイルの入出力処理を細かく制御したい場合は fopen
関数や fgets
関数、 fclose
関数などを組み合わせて制御します。ここでは以下の関数を組み合わせてファイルを制御するプログラムを取り上げます。
fopen
- ファイルまたは URL をオープンするfgets
- ファイルポインタから 1 行取得すfclose
- オープンされたファイルポインタをクローズする
それでは次のプログラム( fs5.php
)を作成してみましょう。
<?php
$file = "hello.txt";
$handle = fopen($file, "r");
$line = fgets($handle);
echo $line;
fclose($handle);
またここではカレントディレクトリに次のような hello.txt
ファイルが存在するものとします。
Hello PHP
Hello Programming
まずはターミナルからプログラムを実行してみましょう。
$ php fs5.php
Hello PHP
実行結果から hello.txt
ファイルの1行目の内容が出力されているのがわかります。
それではプログラムの詳細を見てみましょう。ファイルの読み込みを行うには、始めに fopen
関数を使います。
$file = "hello.txt"
$handle = fopen($file, "r");
fopen
関数は第1引数に対象となるファイル名、第2引数にアクセス形式を指定します。第2引数のアクセス形式に指定する主要なものは以下のとおりです。
“r”
- 読み込みモード
“w”
- 書き込みモード(上書き)
“a”
- 書き込みモード(追記)
ここでは fopen
関数の第2引数のアクセス形式に "r"
を指定しているので、読み込みモードでファイルを開いています。
また fopen
関数は戻り値として、ファイルポインタを返却します。ファイルポインタとはファイルとの接続を表すものです。これまでのように文字列や数値のようなデータではありませんが、後の fgets
関数や fclose
関数の引数として利用します。このようにファイルポインタを利用することでファイルとやりとりできます。
ファイルポインタはファイルポインタリソースと呼ぶこともあります。
次に fgets
関数を呼び出しています。
$line = fgets($handle);
echo $line;
fgets
関数は引数で受け取ったファイルポインタからデータを1行読み取り、戻り値として返却します。
fgets
関数と類似した関数にfgetc
関数もあります。fgetc
関数はファイルポインタから1文字を取り出すための関数です。
最後に fclose
関数を呼び出しています。
fclose($handle);
fclose
関数は、ファイルを閉じるための関数です。 fclose
関数は引数にファイルポインタ受け取ります。コンピュータ上で開けるファイルの数には上限があるので作業を終えたファイルは閉じておく必要があります。
PHPプログラムはプログラムの終了時に、プログラム内で開いていたファイルを自動的に閉じるようになっています。
while文とfgets関数
さきほどのプログラム( fs5.php
)は以下のように while
文を使うように修正することで、ファイル内のすべての内容を出力できます。
<?php
$file = "hello.txt";
$handle = fopen($file, "r");
$line = fgets($handle);
while($line !== false) {
echo $line;
$line = fgets($handle);
}
fclose($handle);
fgets
関数はファイルから1行ずつデータを読み込み、戻り値として返却します。 fgets
関数を繰り返し呼ぶことでファイルの行を先頭行から順に処理していくことができます。また fgets
関数はファイルの終端に達しているときに呼び出すと戻り値に false
を返します。
また、さきほどのプログラム( fs5.php
)は次のように書き換えることもできます。
<?php
$file = "hello.txt";
$handle = fopen($file, "r");
while(($line = fgets($handle)) !== false) {
echo $line;
}
fclose($handle);
上記のプログラムでは while
文の条件の中で ($line = fgets($handle))
とすることでファイルポインタから1行のデータを読み込みます。ファイルの終端に達している場合は fgets
関数の戻り地に false
が返却されるのでこのように実装することもできます。
それではプログラムを実行してみましょう。
$ php fs5.php
Hello PHP
Hello Programming
実行結果からファイルの内容を全て出力できているのがわかります。
まとめ
fopen
関数は戻り値にファイルポインタを返すfgets
関数はファイルポインタからデータを読み込むfclose
関数でファイルポインタを破棄する
fopen
- ファイルまたはURLをオープンする
- 引数
- ファイル名
- アクセス形式
“r”
- 読み込みモード
“w”
- 書き込みモード(上書き)
“a”
- 書き込みモード(追記)
- 戻り値
- ファイルポインタ
- オープンに失敗した場合は
false
fgets
- ファイルポインタから1行取得する
- 引数
- ファイルポインタ
- 読み込みデータ長 (省略可能)
- 省略時は行末まで読み込む
- 戻り値
- 文字列(1行のデータ)
- 読み込むデータがない場合は
false
- 読み込みに失敗した場合は
false
fclose
- オープンされたファイルポインタをクローズする
- 引数
- ファイルポインタ
- 戻り値
- 成功した場合は
true
、失敗した場合はfalse
- 成功した場合は