Search A.I.
Menu
ホーム

メールマガジン ホームページプログラミングテク

Windowsテク
Javaアプレット サンプル
Java Q & A
JavaScript Q & A
Perl Q & A
Perl レッスン
PHP レッスン
PHPテク
MS-DOS コマンド集
UNIX コマンド集
SQL コマンド集
SEの基礎講座
WEBシステム開発受注します
]無料フォームメール送信サービス
リンク集
PHP レッスン

1. PHP の基礎
2. PHPの文法、条件式
3. PHPの文法、条件式 - 続き
4. 配列について
5. ハッシュ配列について
6. 関数について
7. 関数について - 続き
8. 文字列操作関数
9. 配列操作関数
10. ファイル操作
11. ファイル操作 - 続き
12. パラメータの受け渡し
13. クッキーとセッション
14. 総合練習
15. メール送信
16. ファイルアップロード
17. クラスについて
18. クラスについて - 続き
19. MySQL
20. MySQL - 続き(1)
21. MySQL - 続き(2)
22. PostgreSQL
23. 総合練習
24. 総合練習解答



10. ファイル操作

今日は、ファイル操作について、ご説明いたします。

■ファイル操作の基本
ファイルの読み書きを行うためには、ファイルのオープンとクローズの処理が
基本になります。

ファイルハンドル = fopen("ファイル名", 'オープンフラグ');

ファイルハンドルというのは、一言で言うと、ファイルを操作するための変数です。
オープン時にファイルハンドルを取得し、読み込みや書き込みも、このファイル
ハンドルに対して行います。

ファイルオープン時には、ファイルを読み込みで開くか、書き込みで開くかを
オープンフラグで指定します。オープンフラグの意味は以下の通りです。

'r' 読込み用
'w' 書込み用 (上書き)
'a' 書込み用 (追加)
'r+' 読み書き用
'w+' 読み書き用 (上書き)
'a+' 読み書き用 (追加)

ファイルオープン後、ファイル操作が終了したら、必ずファイルをクローズします。

fclose(ファイルハンドル);

使用例を以下に記述します。

-----------------------------------------------------------------
$filename = "./test.txt";

$fh = fopen($filename, 'r');
if (!$fh) {
print "ファイルオープンに失敗しました。 ".$filename;
exit;
}

fclose($fh);
-----------------------------------------------------------------

fopen()関数は、ファイルオープンに失敗すると、偽が返ってきますので、
エラー時の処理を書くことができます。

ただし、上記の場合、ファイルが存在しないとWarningが表示されてしまいます。
予めtest.txtを同じディレクトリに置いておけば表示されなくなります。

また、権限がない場合もエラーとなります。

-----------------------------------------------------------------
※権限について
よくファイル書き込み時につまづくのですが、読み込みや書き込みを行う
ファイルに対して、それぞれ読み込み権限、書き込み権限が必要になります。
WEBサーバがUNIXの場合、ツールやコマンドを使用して権限を変更します。
ファイルが置いてあるディレクトリにも権限がないと、エラーになってしまい
ますので、注意しましょう。Windowsの場合は、読み取り専用になっていると
書き込みができません。
-----------------------------------------------------------------

■ファイルの読み込み
ファイルをオープンした後に、文字列として中身を取り出す方法をご説明します。

$line = fgets(ファイルハンドル);

ファイルハンドルに対応づけられたファイルの先頭から、1行ずつデータを
読み込みます。1行の区切りとして改行文字が用いられます。通常は、while文で
ループさせます。

-----------------------------------------------------------------
while (!feof($fh)) {
$buffer = fgets($fh);
print $buffer;
}
-----------------------------------------------------------------

feof()関数は、ファイルの最後まで読み込んだかを判定する関数です。
ファイルの最後まで読み込むと、真が返ってくるので、上記のようにすれば
ループを抜けます。

また、1文字ずつ読み込むには、以下のようにします。

$char = fgetc(ファイルハンドル);

fgets()と同様に読み込むことができます。

-----------------------------------------------------------------
while (!feof($fh)) {
$char = fgetc($fh);
print $char;
}
-----------------------------------------------------------------

読み込むバイト数を指定して読み込むこともできます。

$buffer = fread(ファイルハンドル, バイト数);

fread()関数の第二引数で指定したバイト数分、ファイルから読み込みます。

-----------------------------------------------------------------
while (!feof($fh)) {
$buffer = fread($fh, 8192);
print $buffer;
}
-----------------------------------------------------------------

どれでも、使いやすい関数を使って構いませんが、fgets()がもっとも分かりやすい
かと思います。

■ファイルの書き込み
ファイルをオープンした後に、ファイルの中身に文字列を書き込む方法をご説明
します。

fwrite(ファイルハンドル, 出力データ);

ファイルへの出力は、 fwrite の第二引数に fopen で取得したファイル
ハンドルを指定します。

-----------------------------------------------------------------
fwrite($fh, "File write test.\n");
fwrite($fh, "This is a file write sample.\n");
-----------------------------------------------------------------

上記のように、ファイルハンドルを第1引数に記述することで、ファイルに
書き込みを行うことができます。

fwrite(ファイルハンドル, 出力データ, 出力バイト長);

バイト数を指定して書き込みたい場合は、上記のように、第三引数にバイト数を
指定します。

-----------------------------------------------------------------
fwrite($fh, "File write test.\n", 64);
-----------------------------------------------------------------

指定したバイト数より書き込みデータが多い場合は、データが切り捨てられます。

 

★今日のまとめサンプルプログラム
-----------------------------------------------------------------
<HTML>
<BODY>
<?

$filename = "./test.txt";
// 読み込みモードでファイルオープン
$fh = fopen($filename, 'r');
if (!$fh) {
print "ファイルオープンに失敗しました。 ".$filename;
exit;
}

// ファイル読み込み
while (!feof($fh)) {
$buffer = fgets($fh);
print $buffer;
}

// ファイルクローズ
fclose($fh);

// 書き込みモードでファイルオープン
$fh = fopen("./test2.txt", 'w');
if (!$fh) {
print "ファイルオープンに失敗しました。 ./test2.txt";
exit;
}

// ファイル書き込み
fwrite($fh, "This is a test sample.\n");

// ファイルクローズ
fclose($fh);

?>
</BODY>
</HTML>
-----------------------------------------------------------------

■解説
PHPを置いているディレクトリに、適当に中身を書いた"test.txt"と"test2.txt"を
置いて実行してみてください。

PHPを動かした後、"test2.txt"の中身も確認してみてください。

 

★課題
1. 簡易的なアクセスカウンタを作成してください。
(ヒント)最初は 0 とだけ書いた"count.txt"を作成し、ファイル読み込みを行い、
数字に 1 プラスしたら、それをファイルに上書きし、HTMLにも表示します。

 

★前回の課題の解答
1. 以下の処理を行うプログラムを作成してください。

(1) 'sun;mon;tue;wed;thu;fri;sat'という文字列の";"を除いて配列に格納し、
さらに" : "で区切った文字列に連結し、出力する
(2) 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'という文字列の','を
除いて配列に格納し、アルファベットの逆順にソートする
(3) ('sun','mon','tue','wed','thu','fri','sat')という配列で、最初の'sun'を
一番最後に移動する処理
(4) ('name'=>'Ichiro Suzuki','mail'=>'mail@email.co.jp')というハッシュ配列の
ハッシュ値のみを取り出して出力する

→下のサンプルを参照してください。

-----------------------------------------------------------------
<HTML>
<BODY>
<?

// (1) 'sun;mon;tue;wed;thu;fri;sat'という文字列の";"を除いて配列に格納し、
// さらに" : "で区切った文字列に連結し、出力する
$week = 'sun;mon;tue;wed;thu;fri;sat';
$ary_week = split(";", $week);
$week = join(" : ", $ary_week);
print $week . "<br>";

// (2) 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'という文字列の','を
// 除いて配列に格納し、アルファベットの逆順にソートする
$mon = 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec';
$ary_mon = split(",", $mon);
rsort($ary_mon);
print_r($ary_mon);
print "<br>";

// (3) ('sun','mon','tue','wed','thu','fri','sat')という配列で、最初の'sun'を
// 一番最後に移動する処理
$ary_week = array('sun','mon','tue','wed','thu','fri','sat');
array_push($ary_week, array_shift($ary_week));
print_r($ary_week);
print "<br>";

// (4) ('name'=>'Ichiro Suzuki','mail'=>'mail@email.co.jp')というハッシュ配列の
// ハッシュ値のみを取り出して出力する
$hash = array('name'=>'Ichiro Suzuki','mail'=>'mail@email.co.jp');
$value = array_values($hash);
print_r($value);

?>
</BODY>
</HTML>
-----------------------------------------------------------------

■解説
だんだんと難しくなってきましたが、レッスンの内容をちゃんと読んでいれば
できるかと思います。

(1)は、split()とjoin()を使います。

(2)は、split()で配列に格納した後、rsort()を使用して、逆順にソートします。

(3)は、array_shift()、array_push()の順に使用します。1 行で書いていますが、
分けても結構です。

(4)は、ハッシュ値のみを取り出すので、array_values()を使用します。




前の章へ 次の章へ


このエントリーをはてなブックマークに追加


OfficeLance

お問い合わせはこちらから