PHPのfopenの使い方: ファイルを開いてデータを読み込む/書き込む

54, 2020-09-22

目次

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引数として適当なものを答えよ

  1. 配列

  2. 文字列

  3. 整数

Q2: バイナリファイルを読み込み/書き込みモードで開きたい。適当なモードを答えよ

  1. rb+

  2. wb+

  3. rt+

Q3: テキストファイルを新規作成し、書き込みモードで開きたい。適当なモードを答えよ

  1. w

  2. r

  3. x


正解はこちら↓

Q1: 2
Q2: 1, 2
Q3: 1, 3