例で覚えるPHP
第9回 ファイル入出力
1.ファイルへの入出力
プログラム内で入力されたデータを別ファイルに書き込んで保存する、というのはよく用いられる手法です。 PHPでは、一般的なテキスト形式のファイル入出力やバイナリ形式のファイル入出力の他にも、 CSVファイルの入出力もライブラリによってサポートされています。
2.ファイルのopen/close
ファイルへの入出力をするためには、まずファイルをopenしてリソースを得る必要があります。このあたりはC言語のファイル操作と大きな違いはありません。
ファイルをopenする際には、fopen()関数を用います。 第一引数にopenするファイルパスを、第二引数にopenする際のモードを設定します。
Open時の各モードを以下に示します。
モード | 説明 | ファイルポインタの位置 |
'r' | 読み込みのみでopen | ファイルの先頭 |
'r+' | 読み込み/書き出し用にopen | ファイルの先頭 |
'w' | 書き出しのみでopen ファイルサイズを0にする ファイルが存在しない場合、作成を試みる |
ファイルの先頭 |
'w+' | 書き出し/書き出し用にopen ファイルサイズを0にする ファイルが存在しない場合、作成を試みる |
ファイルの先頭 |
'a' | 書き出しのみでopen ファイルが存在しない場合、作成を試みる |
ファイルの終端 |
'a+' | 読み込み/書き出し用にopen ファイルが存在しない場合、作成を試みる |
ファイルの終端 |
'x' | 書き出しのみでopen 既にファイルが存在する場合、E_WARNINGレベルのエラーを出力する ファイルが存在しない場合、作成を試みる |
ファイルの先頭 |
'x+' | 読み込み/書き出し用にopen 既にファイルが存在する場合、E_WARNINGレベルのエラーを出力する ファイルが存在しない場合、作成を試みる |
ファイルの先頭 |
ここでいうファイルポインタというのは、処理によってどこからファイルの操作を行うのかを示すものです。
<?php if(!$FP = fopen("./test.txt","w")) echo "error"; else{ fwrite($FP,"test"); fclose($FP); } ?>出力先のテキストファイル:

3.テキスト形式とバイナリ形式のファイル入出力
テキスト形式やバイナリ形式でファイルの入出力を行う場合は、file_get_contents()関数やfile_put_contents()関数を用いると便利です。さらに、C言語でも馴染みの深いfgets()関数やfgetc()関数も用いることができます。
file_get_contents()関数やfile_put_contents()関数では、引数のフラグの値によってテキスト形式でのファイル操作かバイナリ形式でのファイル操作かを選ぶことができます。 (PHP6以降でのみ可能)
<?php echo "ファイル書込<br>"; if(file_put_contents("./test.txt","more test")) echo "書き込みました"; else{ echo "書き込みに失敗しました"; } echo "<br><br>ファイル読込<br>"; if($str=file_get_contents("./test.txt")) echo $str; else echo "読み込みに失敗しました"; ?>ブラウザからの実行結果:

アクセスされたテキストファイル:

4.CSV形式のファイル入出力
CSVファイルとはデータの羅列をカンマで区切ったファイルのことで、 Excelなどの表計算ソフトで扱いやすいという特徴があります。この形式のファイルへの入出力も、PHPではサポートしています。 CSVファイルの入出力を行う場合は、fgetcsv()関数や、fputcsv()関数を用います。
<?php if(!$FP = fopen("./test.csv","r+")) echo "fopen error"; else{ $csv=fgetcsv($FP); print_r(array_values($csv)); $add_data = array("and test","or test","not test"); if(!fputcsv($FP,$add_data)) echo "<br>書込に失敗しました"; else echo "<br>データを書込ました"; fclose($FP); } ?>ブラウザからの実行結果:

アクセスされたCSVファイル:

コメントの投稿
トラックバックURL
http://www.isl.ne.jp/cgi-bin/mt/mt-tb.cgi/1561