「+>>」モード(読み書き)
次は「+>>」モード(読み書き)です。このモードの場合は読み込みと書き込みの両方が利用できる状態でファイルを開きます。書式は次のどちらかを使用します。
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, "+>gt;", "data11-1.txt") or die("Error:$!"); print "追加前:¥n"; while(my $line = <DATAFILE>){ chomp($line); print "$line¥n"; } print DATAFILE "加藤 花子¥n"; print DATAFILE "東京都新宿区¥n"; print DATAFILE "女性"; close(DATAFILE); open(DATAFILE, "+>>", "data11-1.txt") or die("Error:$!"); print "追加後:¥n"; while(my $line = <DATAFILE>){ chomp($line); print "$line¥n"; } close(DATAFILE); open(DATAFILE, "+>>", "data11-2.txt") or die("Error:$!"); print DATAFILE "山崎 一郎¥n"; print DATAFILE "大阪府吹田市¥n"; print DATAFILE "男性"; close(DATAFILE);
上記を「test11-1.pl」の名前で保存します。保存する時の文字コードは「UTF-8」として下さい。
今回はカレントディレクトリに「data11-1.txt」と言うファイルを用意します。ファイル内には次のように記述を行います。ファイルの文字コードはUTF-8(BOM無し)に設定してあります。
コマンドプロンプトを起動し、プログラムを保存したディレクトリに移動してから次のように実行して下さい。
まず存在していた「data11-1.txt」ファイルを開きます。。そして内容を一度読み込んで画面に出力した後で、追加で書き込みを行っています。その後同じファイルを再度開き追加で書き込みが行われているか確認するために再度読み込みを行って画面に出力しています。
今回読み込みを行っていますが何も表示されていません。これは「+>>」モードで開いた場合、ファイルポインタが最後に置かれるためです。ファイルポインタとはファイルの中で読み込みや書き込みを行う位置のことです。ファイルポイントが最後にあるので、そこから読み込みを始めても何も読むことが出来ません。追加で書き込みを行った後に再度開いた場合も同じです。ただし、「data11-1.txt」ファイルには追加で書き込みは行われていますので実際にファイルを確認してみると次のようになっています。
次に存在していなかった「data11-2.txt」ファイルを指定してファイルを開いています。「+>>」モードの場合はファイルが存在しなかった場合には新規に作成しますので、「data11-2.txt」ファイルが作成され書き込みが行われます。結果的に「data11-2.txt」ファイルは次のようになります。
( Written by Tatsuo Ikura )