fopen関数から始める!ファイルの読み込み・書き込み方法【PHP入門】

ファイルの読み書きをする方法や手順を知っていますか?

人がマウスでクリックしてファイルを開くのと同じようにまずは書き込みたいファイルや読み込みたいファイルを開いて使えるような状態にしなければなりません。

ファイルの読み書きを行う場合には必ずfopen関数が必要になってきます。

この記事では、

  • fopen関数とは
  • ファイルを読み込む方法が知りたい
  • ファイルに書き込む方法が知りたい

という基本的な内容から、

  • 文字コードを指定して書き込む方法が知りたい
  • 書き込みができない場合の対処法が知りたい
  • 配列を書き込む方法が知りたい

といった応用的な内容に関しても分かりやすく解説していきます!

また、この記事で出てくる関数の早見表も最後にあるので、逆引きしたい方などはそちらから活用してみてくださいね。

fopen関数とは

fopen関数とは、ファイルまたはURLをオープンしてくれる関数です。

あるデータからファイルにデータの情報を読み込ませたり、ファイルの内容にデータ情報を書き込みする際など、ファイルを指定して、指定したファイルを開いて(持ってきて)くれます。

他のファイルの情報を新しいファイルに書き込む
データベースにある情報やその一部を取り出して内容を取得

などというときに、まずはfopen関数を使って書き込み用なのか、読み込み用なのか、または追記用なのかなどの目的に合わせてファイルを準備します。

fopenでファイルを開いた後、指定の条件を通して処理をし、fclose関数で開いたファイルを閉じる、というのが一連の流れとなります。

fopen基本構文:

$変数名(ファイルポインタ) = fopen (“開きたいファイル名”, “オープンモード”);

オープンモードとは、fopen関数でファイルを開く際に、どういう様式(モード)でファイルを開くかを指定します。

以下が主なオープンモードとなります。

書き込み専用でファイルをオープン

オープンモードファイルがない場合ファイルポインタ
の位置
"w"     エラーが出る先頭
"x"      失敗(エラー)する先頭
"c"      新規作成する先頭
"a" ※追記専用新規作成する末尾

読み込み専用でファイルをオープン

オープンモードファイルがない場合ファイルポインタ
の位置
"r"      エラーが出る先頭

読み・書き用でファイルをオープン

オープンモードファイルがない場合ファイルポインタ
の位置
"w+"     新規作成する先頭
"x+"      エラーが出る先頭
"c+"      新規作成する先頭
"a+"      新規作成する末尾
"r+"      エラーが出る先頭

ファイルポインタとは、どこからファイルに読み込みや書き込みをするかの始まりの位置となります。

既存する内容に追記したい場合は、ファイルポインタが終端にある“a”“a+”を指定しないと、上書きされてしまうので注意が必要です。

ファイルに書き込む方法

ファイルを書き込むには、まずfopen関数でファイルを開きます。

次にfwrite関数で文字列を書き込みます。

以下、ファイルに書き込むサンプルです。

<?php

// 書き込みモードでファイルを開く
$fp = fopen("fwrite.txt", "w");

// ファイルに書き込む
fwrite($fp, "write sample");

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

?>

fwrite.txtの実行結果

write sample

fopen("fwrite.txt", "w")で、ファイルfwrite.txtを書き込みモード(w)で開いています。

fwrite関数はファイルポインタに指定した文字列を書き込みます。

fwrite($fp, "write sample")では、fopen関数が返したファイルポインタをfwrite関数に渡し、文字列"fwrite sample"を書き込んでいます。

読み込みと同様、開いたファイルは最後にfclose関数を使用して閉じます。

追加で書き込む

追加で書き込むには、fopen関数のモードに"a"を指定します。

ファイルに追加で書き込むサンプルです。

<?php

// 書き込みモード(追記)でファイルを開く
$fp = fopen("fwrite.txt", "a");

// ファイルに書き込む
fwrite($fp, "add sample");

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

?>

このプログラムが実行されるたびに、fwrite.txtの末尾に"add sample"が追記されていきます。

文字コードを指定して書き込む

PHPファイルと、読み込んだり書き込むファイルの文字コードが異なると、文字化けが起こります。

例えばPHPファイルの文字コードがUTF-8で、書き込むファイルの文字コードがShif-JISの場合、書き込まれた文字列は文字化けしてしまいます。

文字化けを解消するには、書き込む文字列と書き込むファイルの文字コードを統一します。

mb_convert_encoding関数は、指定した文字列を指定した文字コードに変換し、返します。

基本構文:

mb_convert_encoding(変換する文字列, 変換後の文字コード);

以下、文字コードを変換してファイルに書き込むサンプルです。

<?php

// 書き込みモードでファイルを開く
$fp = fopen("fwrite.txt", "a");

// Shift-JISに変換する
$str = mb_convert_encoding("書き込みサンプル", "Shift-JIS");

// ファイルに書き込む
fwrite($fp, $str);

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

?>

mb_convert_encoding("書き込みサンプル", "Shift-JIS")で、"書き込みサンプル"の文字列がShift-JISに変換されます。

その変換された文字列をShift-JISのファイルに書き込めば、文字化けは起こりません。

配列をファイルに書き込む

fputcsv関数を使うと、配列の値をCSV形式(カンマ「,」で区切られたデータ形式)でファイルに書き込むことができます。

以下、ファイルに書き込むサンプルです。

<?php

// 書き込む配列を生成する
$array = ["data1", "data2", "data3"];
 
// 書き込みモードでファイルを開く
$fp = fopen("fputcsv.csv", "w");

// CSV形式で書き込む
fputcsv($fp, $array);

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

?>

ファイルfputcsv.csvの内容結果

data1,data2,data3

fopen("fputcsv.csv", "w")で、ファイルfputcsv.csvを書き込みモード(w)で開いています。

fputcsv関数は、ファイルポインタに指定した配列をCSV形式で書き込みます。

fputcsv($fp, $array)では、fopen関数が返したファイルポインタをfputcsv関数に渡し、配列$arrayを書き込んでいます。

最後にfclose関数を使用して閉じます。

CSVデータを読み込むにはfgetcsv関数が使われます。

CSVファイルの読み込みについては、以下の記事で詳しく解説しています。

ファイルを読み込む方法

ファイルを読み込むには、まずfopen関数でファイルを開きます。

次にfgets関数でファイルの内容を1行ずつ取得して読み込みます。

以下、ファイルを読み込むサンプルです。

ファイル名:fgets.txt

fgets.txtファイルの内容

row1
row2
row3
row4
row5
<?php
// 読み込みモードでファイルを開く
$fp = fopen("fgets.txt", "r");

// ファイルを1行ずつ取得する
while ($line = fgets($fp)) {
  echo "$line<br>";
}

// ファイルを閉じる
fclose($fp);
?>

実行結果

row1
row2
row3
row4
row5

fopen("fgets.txt", "r")で指定したファイルfgets.txtを、指定した読み込みモード(r)で開き、ファイルポインタを返します。

fgets関数はファイルポインタから1行ずつ読み込みます。

$line = fgets($fp)では、fopen関数が返したファイルポインタをfgets関数に渡し、1行ずつ読み込んでいます。

fgets関数は読み込むデータがなくなるとFALSEを返すので、それまで読み込みを繰り返すことで、ファイルの内容をすべて読み込むことができます。

開いたファイルは、最後にfclose関数を使用して閉じます。

指定した外部ファイルを読み込み実行する

外部ファイルを読み込み、外部ファイルに書いた処理を呼び出す事も可能です。

外部ファイルを読み込むにはinclude文require文を使用します。

以下の例では、include文を使ってフォルダinclude1.phpからフォルダinclude2.phpを読み込みます。

include1.php

<?php

echo "include1";
echo "<br>";
include "include2.php";

?>

include2.php

<?php

echo "include2";

?>

include1.phpの実行結果

include1
include2

include1.phpのinclude "include2.php";include2.phpを読み込み、include2.phpの処理を実行しています。

include文については、以下の記事で詳しく解説しています。

require文については、以下の記事で詳しく解説しています。

ファイルの書き込みができない場合

ファイルの書き込みに失敗するには

  • 書き込むファイルが存在しない
  • fopen関数のモードに、書き込みモードを指定していない
  • ファイルに書き込む権限がない

というような原因が考えられます。

ファイルに書き込む権限がない場合は、以下のようなエラーが表示されます。

Warning:  fopen(fwrite.txt): failed to open stream: Permission denied in ...

このエラーを解消するには、パーミッション(アクセス権)を変更します。

PHPでパーミッションを変更するには、chmod関数を使用します。

基本構文:

chmod(変更するファイル名, 変更後のパーミッション)

パーミッションは通常「606」のように表しますが、前にゼロ(0)を付けて4桁で指定しないとエラーになります。

書き込み権限を追加するには、以下のように記述します。

<?php

chmod("fwrite.txt", 0606);

?>

もしエラーが出てしまったら、1つ1つ確認してみてくださいね。

fopenに関連する関数早見表

この記事で紹介した関数の早見表です。

ぜひ活用してみてください。

ファイルの開閉(オープン・クローズ)

関数用途基本構文
fopenファイルを  
開く   
$変数名(ファイルポインタ) =
fopen (“開きたいファイル名”, “オープンモード”)
fcloseファイルを  
閉める  
fclose($ファイルポインタ)

ファイルを読み込む

関数用途基本構文
fgetsファイルを  
読み込む   
fgets($ファイルポインタ)
include外部ファイル
を読み込む 
include “読み込みたいファイル名”
require外部ファイル
を読み込む 
require “読み込みたいファイル名”
fgetcsvCSVデータを
読み込む  
fgetcsv($ファイルポインタ)

ファイルに書き込む

関数用途基本構文
fwriteファイルに  
書き込む  
fwrite($対象ファイル, "書き込む文字列またはその
$変数")
fputcsvCSV形式で 
書き込む
fputcsv($ファイルポインタ, $書き込む配列 [,”区
切り文字”])

その他

関数用途基本構文
mb_convert
_encoding
文字コードを
指定して書き
込む 
mb_convert_encoding(変換する文字列, 変換後の
文字コード);
chmod書き込み権限
を追加する  
chmod(“変更するファイル名”, 変更後のパーミッ
ション)

ファイル操作についての記事はいかにまとめてあります。
今後ファイルの操作について勉強したいという方は、ぜひ参考にしてくださいね。

まとめ

今回はfopen関数についてと、ファイルの読み込み、書き込み方法について解説しました。

データのファイル入出力やログ出力など、実際のシステム開発でもファイルを扱う処理は多いです。

ファイルの読み込み、書き込み方法を忘れてしまったら、この記事を思い出して下さい!

LINEで送る
Pocket

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

muramatsu

muramatsu

世界中の人たちと友達になって、その友達の家を巡る旅をしたいと密かに思っている。

複雑な内容を誰にでもわかりやすく、そして納得のいくような解説をする、をモットーにしています!

おすすめコンテンツ

いまならレッスン期間が2週間延長!この秋、プログラミングを学ぼう

転職成功で受講料0円!あなたもプログラミングを学んでエンジニアデビュー