「+<」モード:ファイルの先頭から上書きで書き込む(読み書き両用)

Perl で open 関数を使ってファイルを開く際に、「+<」モードを指定すると読み込みおよび書き込みの両方が行える状態でファイルを開くことができます。対象のファイルが既に存在していた場合は既存の内容は変更せずに追加でファイルへ書き込みを行います(ファイルポインタは先頭)。ここでは Perl のプログラムの中で「+<」モードを使って読み込みと書き込みができる状態でファイルを開く方法について解説します。

(Last modified: )

「+<」モードでファイルを開く

モードとして +< を指定した場合、読み込みと書き込みの両方が利用できる状態でファイルを開きます。書式は次のどちらかを使用します。

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, "+<", "data.txt") or die("Error:$!");

print DATAFILE "東京都";

seek(DATAFILE, 0, 0);
while(my $line = <DATAFILE>){
  chomp($line);
  print "$line\n";
}

close(DATAFILE);

テキストエディタでプログラムを記述したあと sample.pl という名前で保存します。(文字コードは UTF-8 です)。コマンドプロンプトを起動し、プログラムを保存したディレクトリへ移動したあとで次のように実行します。

perl sample.pl

あらかじめ sample.pl と同じディレクトリに data.txt というファイルを作成しておきました(文字コードは UTF-8 です)。ファイルには次のようなテキストデータを入力してあります。

「+<」モード:ファイルの先頭から上書きで書き込む(読み書き両用)(1)

次のように実行結果が表示されます。

「+<」モード:ファイルの先頭から上書きで書き込む(読み書き両用)(2)

プログラムを実行するとファイルの先頭から上書きでテキストデータが書き込まれました。今回は 3 文字分書き込みを行っているので結果としてファイルの先頭から 3 文字分が上書きされています。なおファイルの読み込みを行う前に seek 関数を使ってファイルポイントをファイルの先頭に移動しています。

-- --

Perl のプログラムの中で「+<」モードを使って読み込みと書き込みができる状態でファイルを開く方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。