PHPのfopenの使い方: ファイルを開いてデータを読み込む/書き込む
目次
PHPのfopenの使い方
PHPにはファイルまたはURLを開く関数fopen
があります。
ファイルを開いて内容を読み込み、処理をするというケースはプログラミングでは多いですが、fopen
はその際に使用する関数の1つです。
fopen
は↓のように使います。
<?php $fname = 'sample.txt'; // ファイル名 $fin = fopen($fname, 'rt'); // テキストファイルを読み込みモードで開く $contents = fread($fin, filesize($fname)); // ファイル内容を読み込む fclose($fin); // ファイルを閉じる echo $contents; // ファイル内容を出力 ?>
出力結果。
cat dog bird
PHPの対応バージョン
fopen
は以下のバージョンに対応しています。
PHP 4
PHP 5
PHP 7
fopenの構造
fopen
は↓のような構造を持っています。
<?php fopen(ファイル名, モード, use_include_path, コンテキスト); ?>
ファイル名(第1引数)
オープンするファイル名を指定します。
UNIX系OSの場合、↓のようにローカルファイルを指定します。
<?php fopen('file.txt', 'r') fopen('./file.txt', 'r') fopen('/tmp/file.txt', 'r') ?>
Windowsの場合はバックスラッシュをエスケープするかUNIXと同様にフォワードスラッシュを使用します。
<?php fopen('C:\\tmp\\file.txt', 'r') fopen('/tmp/file.txt', 'r') ?>
ファイル名がURLの場合、fopen
はそのURLを開きます。
<?php fopen('https://yu-nix.com/getip/', 'r'); fopen('ftp://user:password@mysite.com/myfile.txt', 'w'); ?>
モード(第2引数)
ファイルのオープンモードを指定します。
デフォルトで各モードにb
が付加されます。
明示的にテキストファイルを開きたい場合は各モードにt
を付加してください。
r
ファイルのファイルポインタを先頭に移動し、読み込みモードで開きます。
rt
の場合はテキストモードで開き、rb
の場合はバイナリモードで開きます。
r+
ファイルのファイルポインタを先頭に移動し、読み込み/書き込みモードで開きます。
rt+
の場合はテキストモードで開き、rb+
の場合はバイナリモードで開きます。
w
ファイルを書き込みモードで開きます。
ファイルが存在する場合はファイルの内容を空にして開き、ファイルが存在しない場合は新規作成して開きます。
wt
の場合はテキストモードで開き、wb
の場合はバイナリモードで開きます。
w+
ファイルを読み込み/書き込みモードで開きます。
ファイルのファイルポインタを先頭に移動し、ファイルを空にして開きます。ファイルが存在しない場合は新規作成して開きます。
wt+
の場合はテキストモードで開き、wb+
の場合はバイナリモードで開きます。
a
ファイルを追記モードで開きます。
ファイルのファイルポインタを末尾に移動し、ファイルが存在しない場合は新規作成します。
このモードではfseek
は無効です。
at
の場合はテキストモードで開き、ab
の場合はバイナリモードで開きます。
a+
ファイルを読み込み/書き込みモードで開きます。
ファイルのファイルポインタを末尾に移動し、ファイルが存在しない場合は新規作成して開きます。
このモードではfseek
は読み込み位置のみに作用します。書き込みは常に追記です。
at+
の場合はテキストモードで開き、ab+
の場合はバイナリモードで開きます。
x
ファイルを書き込みモードで開き、ファイルポインタを先頭に移動します。
ファイルがすでに存在する場合はエラーになります。
xt
の場合はテキストモードで開き、xb
の場合はバイナリモードで開きます。
x+
ファイルを読み込み/書き込みモードで開きます。それ以外はx
と同じです。
xt+
の場合はテキストモードで開き、xb+
の場合はバイナリモードで開きます。
c
ファイルを書き込みモードで開きます。ファイルが存在しない場合は新規作成して開きます。
ファイルがすでに存在する場合はそのまま開いてファイルポインタを先頭に移動します。
ct
の場合はテキストモードで開き、cb
の場合はバイナリモードで開きます。
c+
ファイルを読み込み/書き込みモードで開きます。それ以外はc
と同じです。
ct+
の場合はテキストモードで開き、cb+
の場合はバイナリモードで開きます。
e
オープンしたファイル記述子にclose-on-exec
フラグを設定します。
(POSIX.1-2008準拠のシステム限定)
use_include_path(第3引数)
TRUE
を設定するとinclude_path
のファイルの検索も行えます。
コンテキスト(第4引数)
PHP5.0.0
からサポートされました。
返り値
成功した場合はファイルのハンドル、失敗した場合はFALSE
を返します。
エラー/例外
失敗した場合はE_WARNING
が発生します。
テキストファイルを開いて内容を読み込む
テキストファイルを開き内容をfgets()
で読み込みます。
<?php $fname = 'sample.txt'; // ファイル名 $fin = fopen($fname, 'rt'); // テキストファイルを読み込みモードで開く // 1行づつ読み込み出力する while (($line = fgets($fin, 1024))) { echo $line; } fclose($fin); // ファイルを閉じる ?>
出力結果。
cat dog bird
テキストファイルにテキストを書き込む
テキストファイルを開きテキストを書き込みます。
<?php $fname = 'sample.txt'; // ファイル名 $fout = fopen($fname, 'wt'); // テキストファイルを書き込みモードで開く fwrite($fout, "cat\n"); // 1行書き込む fwrite($fout, "dog\n"); // 1行書き込む fwrite($fout, "bird\n"); // 1行書き込む fclose($fout); // ファイルを閉じる ?>
書き込み結果。
$ cat sample.txt cat dog bird
URLのリソースを得る
https://yu-nix.com/getip/にアクセスしてIPを得ます。
<?php $fname = 'https://yu-nix.com/getip/'; // URL $fout = fopen($fname, 'rt'); // URLを読み込みモード(テキスト)で開く $ip = fgets($fout, 1024); // IPを得る fclose($fout); // ファイルを閉じる echo $ip; // IPを表示 ?>
出力結果。
xxx.xxx.xxx.xxx
問題
Q1: fopen
の第1引数として適当なものを答えよ
配列
文字列
整数
Q2: バイナリファイルを読み込み/書き込みモードで開きたい。適当なモードを答えよ
rb+
wb+
rt+
Q3: テキストファイルを新規作成し、書き込みモードで開きたい。適当なモードを答えよ
w
r
x
正解はこちら↓
Q1: 2
Q2: 1, 2
Q3: 1, 3