※ここの解説は、後になるほど省略されている場合がありますのでできるだけ順番に読んでください。
■ 14.ファイルの読み書き
さて、次はファイルの入出力を説明します。
「7.テキストの一括表示」でopen文は出てきましたが、詳しく説明しませんでしたので、ここで説明します。
open文は、指定されたファイルの情報を読み込んだり、そのファイルに書き出したりすることができます。
それでは、open文の説明をしておきます。
■ open文の記述
open文の記述には次のようなものがあります。
(特殊なopen文は省略しています。)
記述例 | 意 味 |
---|---|
open(FILE,"filename"); open(FILE,"<filename"); | 読み込み専用 |
open(FILE,">filename"); | 書き出し専用 |
open(FILE,">>filename"); | 追加書き出し用 |
open(FILE,"+<filename"); | 読み書き両用 (既存データを残す) |
open(FILE,"+>filename"); | 読み書き両用 (既存データを消去する) |
FILEはファイルハンドラといって、そのファイルを読み書きするための番号を管理するための変数です。
したがって、自由な変数が指定できますが、わかりやすく大文字などで記述することが多いです。
open( )の括弧は省略することもできますが、わかりやすくするため記述することが多いです。
また、open文が正常に実行できなかったときのために次のようにエラー処理を記述しておきます。
記述例 | 意 味 |
---|---|
open(FILE,"test.dat") || exit(0); | openできなかったときは、強制終了する。 何も表示されない。 |
open(FILE,"test.dat") || die "Can't open"; | openできなかったときは、「Can't open」を表示し、強制終了する。 |
open(FILE,"test.dat") || print "Can't open"; | openできなかったときは、「Can't open」を表示し、次のステップに進む。 |
open(FILE,"test.dat") || &err_dsp; ・ ・ sub err_dsp{ print "Can't open"; exit(0); } |
openできなかったときは、「Can't open」を表示し、強制終了する。 サブルーチン(err_dsp)にジャンプし、サブルーチン側で処理する。 |
open文の使用サンプルをいくつか紹介します。
記述例 | 意 味 |
---|---|
open(FILE,$filnam); $line = <FILE>; close(FILE); | $filenamで指定されたファイルを1行読む |
open(FILE,$filnam); @line = <FILE>; close(FILE); | $filenamで指定されたファイルをすべて読む |
open(FILE,$filnam); while($line = <FILE>) { print $line; } close(FILE); | $filenamで指定されたファイルを内容をすべて出力(表示)する |
open(FILE,$filnam); while(<FILE>) { print; } close(FILE); | 同上 |
open(FILE,$filnam); while(<FILE>) { print $_; } close(FILE); | 同上 |
open(FILE,">$filnam"); print FILE $line; close(FILE); | $filenamで指定されたファイルへ$lineの内容を書き出す |
open(FILE,">$filnam"); print FILE @line; close(FILE); | $filenamで指定されたファイルへ@lineの内容を書き出す |
■ ファイルのロック処理
ファイルの読み書きを同時に行った場合、ファイルの内容が正しくならない場合があります。
そういうときは、ファイルを前もってロックし、処理が終わったら解除するといいです。
ファイルのロック中は他からの読み書きは待ち状態になります。
このような処理を排他制御と言います。
記述例 | 意 味 |
---|---|
open(FILE,">$filnam"); flock(FILE,2); print FILE @line; flock(FILE,8); close(FILE); | $filnamのオープン ファイルをロックする @lineの内容を書き出す ファイルのロック解除 $filnamを閉じる |
flock命令はUNIX系以外(Windowsなど)のシステムではファイルシステムが違うため、その命令で強制終了してしまいます。
flock命令のあるCGIなどをWindows環境下で実行する場合は、一時的にでもflock命令をコメントアウト(注釈)しないといけません。