【PHP】これで分かる関数! – ファイル操作その2 –

PHP

更新履歴

更新日更新者更新内容
2021/8/24JJI・サンプルプログラムの実行結果に画面の画像を追加

はじめに

この記事で載せているサンプルプログラムは次の記事で紹介する関数を使用している場合があります。

ファイルの作成

ファイルを作成する場合、次のいずれかの関数を使用します。

  • fopen
  • touch

関数の使い方は次のサンプルプログラムを見てください。

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);
    // 共通ライブラリの読み込み
    require_once __DIR__ . "../../../lib/sample_common.php";

    echo "ファイル名:" . basename(__FILE__) . "<br>\n";
    echo "【PHP】ファイルの作成<br>\n";

    // 存在しないファイルを読み取り専用(r)で開く、エラーとなる
    open_file("data/noexists01.txt", "r");
    open_file("data/noexists02.txt", "r+");

    // wモードで存在しないファイルの新規作成
    open_file("data/file01.txt", "w");
    open_file("data/file02.txt", "w+");

    // aモードで存在しないファイルの新規作成
    open_file("data/file03.txt", "a");
    open_file("data/file04.txt", "a+");

    // xモードで存在しないファイルの新規作成
    open_file("data/file05.txt", "x");
    open_file("data/file06.txt", "x+");

    // touchコマンドでファイルの新規作成
    touch("data/file07.txt");

    // 作成したファイルの削除
    for($i = 1; $i < 8; $i++) {
        echo "data/file0${i}.txtの削除<br>\n";
        unlink("data/file0${i}.txt");
    }

    // ファイルのオープン関数
    function open_file(string $filename, string $mode) :bool {
        // ファイルのオープン
        $fp = @fopen($filename, $mode);
        // ファイルのオープンに失敗した場合
        if($fp == false) {
            echo "Error: Failed to open file:${filename}: mode:${mode}:<br>\n";
            return false;
        }

        echo "Success: open file:${filename}: mode:${mode}:<br>\n";
        return true;
    }
?>

実行結果です。

・画面

・HTML

ファイル名:sample02_08_04.php<br>
【PHP】ファイルの作成<br>

Error: Failed to open file:data/noexists01.txt: mode:r:<br>
Error: Failed to open file:data/noexists02.txt: mode:r+:<br>
Success: open file:data/file01.txt: mode:w:<br>
Success: open file:data/file02.txt: mode:w+:<br>
Success: open file:data/file03.txt: mode:a:<br>
Success: open file:data/file04.txt: mode:a+:<br>
Success: open file:data/file05.txt: mode:x:<br>
Success: open file:data/file06.txt: mode:x+:<br>
data/file01.txtの削除<br>
data/file02.txtの削除<br>
data/file03.txtの削除<br>
data/file04.txtの削除<br>
data/file05.txtの削除<br>
data/file06.txtの削除<br>
data/file07.txtの削除<br>

ファイルの読み込み

ファイルを読み込む場合、次の方法があります。

  1. fopen()、fgets()関数でファイルの内容を1行ずつ読み込む
  2. file()関数でファイルを一括に読み込む
  3. file_get_contents()関数でファイルの内容を一括に読み込む
  4. fopen()、fgetc()関数でファイルの内容を1バイトずつ読み込む
  5. fopen()、fgetcsv()関数でCSVファイルを読み込む
  6. fopen()、fread()関数でファイルを指定バイト数分だけで読み込む

1~3は次のサンプルプログラム1、4~6は次のサンプルプログラム2を見てください。

サンプルプログラム1

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);
    // 共通ライブラリの読み込み
    require_once __DIR__ . "../../../lib/sample_common.php";
    require_once __DIR__ . "./lib/sample_file.php";

    echo "ファイル名:" . basename(__FILE__) . "<br>\n";
    echo "【PHP】ファイルの読み込み<br>\n";

    // fopen()、fgets()
    echo "fopen()関数でオープンし、1行ずつ表示する<br>\n";
    $fp = read_file("data/read/readfile01.txt","r");
    while($line = fgets($fp)) {
        echo preg_replace("/\n/", "<br>\n", $line);
    }
    fclose($fp);
    echo "<br><br>\n";

    // file()
    echo "file()関数での読み込み<br>\n";
    $ary = file("data/read/readfile01.txt");
    foreach($ary as $data) {
        echo preg_replace("/\n/", "<br>\n", $data);
    }
    echo "<br><br>\n";

    // file_get_contents()
    echo "file_get_contents()関数での読み込み<br>\n";
    $str = file_get_contents("data/read/readfile01.txt");
    echo preg_replace("/\n/", "<br>\n", $str);
    echo "<br><br>\n";
?>

実行結果です。

・画面

・HTML

ファイル名:sample02_08_05_01.php<br>
【PHP】ファイルの読み込み<br>
fopen()関数でオープンし、1行ずつ表示する<br>
ハローワールド
<br>
hello world<br><br>
file()関数での読み込み<br>
ハローワールド
<br>
hello world<br><br>
file_get_contents()関数での読み込み<br>
ハローワールド
<br>
hello world<br><br>

サンプルプログラム2

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);
    // 共通ライブラリの読み込み
    require_once __DIR__ . "../../../lib/sample_common.php";
    require_once __DIR__ . "./lib/sample_file.php";

    echo "ファイル名:" . basename(__FILE__) . "<br>\n";
    echo "【PHP】ファイルの読み込み<br>\n";

    // fopen()、fgetc()
    echo "fopen()関数でオープンし、1バイトずつ表示する<br>\n";
    $fp = read_file("data/read/readfile01.txt","r");
    while( ($str = fgetc($fp)) !== false) {
        echo ":" . preg_replace("/\n/", "<br>\n", $str) . ":";
    }
    fclose($fp);
    echo "<br><br>\n";

    // fopen()、fgetcsv()
    echo "fopen()関数でCSVファイルをオープンし、表示する<br>\n";
    $fp = read_file("data/read/readfile02.csv","r");
    while( ($csvdatas = fgetcsv($fp)) !== false) {
        echo_array1($csvdatas);
    }
    fclose($fp);

    // fopen()、fread()
    echo "fopen()関数でファイルをオープンし、fread()関数で10バイトずつ表示する<br>\n";
    $fp = read_file("data/read/readfile01.txt","r");
    while(feof($fp) !== true) {
        $str = fread($fp, 10);
        echo ":${str}:<br>\n";
    }
    fclose($fp);
?>

実行結果です。
バイト単位で読み込む処理の場合、マルチバイト文字は正しく処理ができないため、文字化けが発生します。

・画面

・HTML

ファイル名:sample02_08_05_02.php<br>
【PHP】ファイルの読み込み<br>
fopen()関数でオープンし、1バイトずつ表示する<br>
:�::�::�::�::�::�::�::�::�::�::�::�::�::�::�::�::�::�::�::�::�::
::<br>
::h::e::l::l::o:: ::w::o::r::l::d:<br><br>
fopen()関数でCSVファイルをオープンし、表示する<br>
[0]:yamata: [1]:trou: [2]:32: [3]:male: [4]:Tokyo:<br><br>
[0]:山田: [1]:jirou: [2]:29: [3]:男性: [4]:大阪:<br><br>
fopen()関数でファイルをオープンし、fread()関数で10バイトずつ表示する<br>
:ハロー�:<br>
:��ール�:<br>
:�
hello w:<br>
:orld:<br>

コメント