「+<」モード(読み書き)
次は「+<」モード(読み書き)です。このモードの場合は読み込みと書き込みの両方が利用できる状態でファイルを開きます。書式は次のどちらかを使用します。
open(ファイルハンドル, "+< ファイル名"); open(ファイルハンドル, "+<", "ファイル名");
引数を2つ使う場合にはファイル名の前に「+< 」を付けます。引数を3つ使う場合には2番目の引数に「+<」指定し、3番目の引数にファイル名を指定します。
「+<」モードの場合は次の通りです。
・読み込み、書き込みの両方とも可 ・ファイルが存在していた場合、ファイルを開いた時にファイルの内容を変更しない ・ファイルが存在してなかった場合、エラー ・ファイルポインタは先頭
書き込みの時には元のファイルの内容を変更しませんが、ファイルポインタは先頭になっていますので書き込みを行うと順に上書きされていきます。また指定したファイルが存在しなかった場合はエラーとなります。
実際には次のように記述します。
open(DATAFILE, "+<", "data.txt") or die("error :$!");
この場合、「data.txt」と言うファイルを読み書き両用で開きます。
サンプルプログラム
では簡単なプログラムで確認して見ます。
use strict; use warnings; use utf8; use open ":utf8"; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; open(DATAFILE, "+<", "data9-1.txt") or die("Error:$!"); print DATAFILE "加藤 花子¥n"; close(DATAFILE); open(DATAFILE, "+<", "data9-1.txt") or die("Error:$!"); print "変更後:¥n"; while(my $line = <DATAFILE>){ chomp($line); print "$line¥n"; } close(DATAFILE); open(DATAFILE, "+<", "data9-2.txt") or die("Error:$!"); print DATAFILE "加藤 花子¥n"; print DATAFILE "東京都新宿区¥n"; print DATAFILE "女性"; close(DATAFILE);
上記を「test9-1.pl」の名前で保存します。保存する時の文字コードは「UTF-8」として下さい。
今回はカレントディレクトリに「data9-1.txt」と言うファイルを用意します。ファイル内には次のように記述を行います。ファイルの文字コードはUTF-8(BOM無し)に設定してあります。
コマンドプロンプトを起動し、プログラムを保存したディレクトリに移動してから次のように実行して下さい。
まず存在していた「data9-1.txt」ファイルを開き追加で書き込みを行っています。ファイルを開いた時点ではファイルの中身は変更されませんが、ファイルポインタが先頭にあるため書き込みを行うと先頭から順に上書きされていきます。
書き込みを行った後で、改めてファイルの先頭から順にデータを読み込み、画面に表示しています。
次に存在していなかった「data9-2.txt」ファイルを指定してファイルを開いていますが、ファイルが存在しなかった場合はエラーとなります。
( Written by Tatsuo Ikura )