ファイルを1行ずつ読み込む
ファイルを開く
PHPでファイルを読み書きするには fopen 関数でファイルを開きます。引数には「ファイル名」と「モード」を指定します。fopen 関数でファイルを開くとファイルポインタ(ハンドルともいう)が返されます。
ファイルの取り扱いが終了したら、 fclose 関数で閉じます。
fclose($fp);
fopen 関数はどんな値を返すのか確認してみました。
fopen 関数の値 サンプル
$handle=fopen("sample.txt","r"); echo $handle;
このサンプルでは「Resource id #3 」を返してきました。
つまりこれをハンドルとして使用するわけです。
次はテキストに存在する全ての行に対してハンドルを返させてみます。
fopen 関数の値(全ての行) サンプル
$handle=fopen("sample.txt","r"); while($line=fgets($handle)){ echo $handle; }
今度はテキストが1行も書かれてないファイルを読み込ませてみました。
fopen 関数の値(何も書かれてないファイル) サンプル
$handle=fopen("sample2.txt","r"); $line=fgets($handle); var_dump( $line);
読み込む値が無ければfalseを返していることが確認できます。
ファイルの読み込み
fopen 関数のモードに r を指定すると、読み込みモードでファイルを開きます。
ファイルを開いたら、fgets 関数でファイルの内容を1行だけ読み出します。
$handleはファイルポインタです。fopen()で正常にオープンされたファイルを指している必要があります。
読み出しは改行文字を検出したか、EOF に達したかのいずれかが起こった時点で終了します。
fgets関数の返り値はhandle で指定したファイルポインタから読み出し、その文字列を返します。ファイルポインタから読み込むデータがない場合は FALSE を返します。また、エラーが起こった場合にもFALSE を返します。
$handle=fopen("sample.txt","r"); $line=fgets($handle); echo $line; fclose($handle);
複数行のテキストを読み込ませるにはwhile文を使います。
fgets関数サンプル(複数行)
$handle=fopen("sample.txt","r"); while($line=fgets($handle)){ echo"$line<br/>"; } fclose($handle);
これを実行すると、sample.txt の内容が改行区切りですべて表示されます。
$line=fgets($handle) によってファイルの内容を1行だけ読み出します。
複数行のテキストを読み込むには、while文を使用して、もし末尾に達してこれ以上読み込むテキストが無くなるとfalseを返してループを終わらせます。
ファイルへの書き込み
fopen 関数のモードに w を指定すると、書き込みモードでファイルを開きます。
書き込みモードでファイルを開くと、fwrite 関数でファイルの内容を書き換えることができます。
書き込みのサンプル
書き込みをしたテキスト
$handle=fopen("sample3.txt","w"); fwrite($handle,"書き込みの練習です。\n書き込みが完了した。\n"); fclose($handle); echo "書き込みました";
sample.txt に「書き込みが完了した。」と書き込まれます。
また、改行が必要な場合は \n を使用して改行します。
サンプルを何度か実行して確認してみると、書き込みは上書きされていることがわかると思います。
モードに w は上書きになりますので注意してください。
ファイルへの追加書き込み
fopen 関数のモードに a を指定(addの略?)すると、追記モードでファイルを開きます。
追記モードでファイルを開くと、fwrite 関数でファイルの内容に追記することができます。
追記モードのサンプル
$handle=fopen("sample3.txt","a"); fwrite($handle,"書き込みの練習です。\n書き込みが完了した。\n"); fclose($handle); echo "書き込みました";
このモードを使用すると、プログラムが実行されるたびにファイルの末尾に追記が行われます。
FILE_GET_CONTENTSについて
ファイルの内容をすべて表示する場合は、file_get_contents 関数を使用することができます。fopen 関数、fgets 関数、fclose 関数を使用せずに一発で表示できます。
サンプル
echo file_get_contents("sample3.txt");
また、ファイルに書き込みをする場合は、file_put_contents 関数を使用します。
サンプル
file_put_contents("sample3.txt","書き込みに成功した。");
ファイルの内容全体を書き換えたい場合は便利な関数です。