ファイルの読み込み

これまでにfile_get_contents関数やfile関数によるファイルの読み込みについて見てきました。ファイルの内容を1つの文字列データとして読み込むのであればfile_get_contents関数、行単位で配列に変換したいのであればfile関数を使うことができます。

これらの関数は手軽に使えますが、ファイルサイズが大きい場合はその分メモリを消費してしまうことになるので注意が必要です。

プログラムの実行環境に依存しますが、ファイルサイズが数KB程度であればfile_get_contents関数やfile関数を使っても問題ないかもしれません。

読み込むファイルサイズが大きい場合や、ファイルの入出力を細かく制御したい場合はfopen関数やfwrite関数などを組み合わせて制御します。ここでは以下の関数を扱うプログラムを取り上げます。

  • 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引数にアクセス形式を指定します。アクセス形式の主要なものは以下のとおりです。

  • “r”
    • 読み込みモード
  • “w”
    • 書き込みモード(上書き)
  • “a”
    • 書き込みモード(追記)

ここでは"r"を指定しているので、ファイルの内容を読み込む目的でファイルを開いています。

またfopen関数は戻り値として、ファイルポインタを返却します。ファイルポインタとはファイルとの接続を表すものです。これまでのように文字列や数値のようなデータではありませんが、後のfgets関数やfclose関数の引数として渡すことでファイルとやりとりすることができます。

ファイルポインタはファイルポインタリソースと呼ぶこともあります。

次にfgets関数を呼び出しています。

$line = fgets($handle);
echo $line;

fgets関数は引数で受け取ったファイルポインタリソースからデータを1行読み取り、戻り値として返却します。

最後にfclose関数を呼び出しています。

fclose($handle);

fclose関数は開いているファイルを閉じるための関数です。fclose関数は引数にファイルポインタリソースを受け取ります。コンピュータ上で開けるファイルの数には上限があるので、作業を終えたファイルは閉じておく必要があります。

PHPプログラムはプログラムの終了時に、プログラム内で開いていたファイルを自動的に閉じるようになっています。

さきほどのプログラム(fs5.php)は以下のようにwhile文を使うように修正することで、ファイル内のすべての内容を出力することができます。

<?php
$file = "hello.txt";
$handle = fopen($file, "r");
while(($line = fgets($handle)) !== false) {
  echo $line;
}
fclose($handle);

fgets関数はファイルから1行ずつデータを読み込み、戻り値として返却します。fgets関数を繰り返し呼ぶことでファイルの行を順に処理していくことができます。fgets関数はファイルの終端に達するとfalseを戻り値として返します。

上記のプログラムではwhile文の条件の中で($line = fgets($handle))とすることでファイルポインタから1行のデータを読み込みます。ファイルの終端に達している場合はfalseが返却されるため上記のように実装することができます。

それではプログラムを実行してみましょう。

$ php fs5_2.php
Hello PHP
Hello Programming

実行結果からファイルの内容を全て出力できているのがわかります。


前へ | 次へ