- ベストアンサー
ファイルの先頭に追加書込みする方法について教えて下さい
今まで、単にファイルの最後にデータを追加するように 下記のように書いていた部分を open(OUT,">>$logfile2") || &error; print OUT "カウント : \[ $pcount \]\n日 時 : \[ $time \]\n"; close(OUT); ファイルの先頭に追加していくようにしたいのですが、うまくいきません。 ミスティーネット・Perl・CGI講座というサイトを参考に下記のようにしてみました。 open(DATA,"+<$logfile2") || &error; seek(DATA,0,0); print DATA "\nカウント : \[ $pcount \]\n日 時 : \[ $time \]\n"; close(DATA); このように書くと追加書込みではなく、書き換えになってしまいます。 また、+<の部分を>>にすると変更前と同様、ファイルの最後に追加されてしまいます。 どこがどういけないのか判る方がみえましたら教えて下さい。 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
CGIのカウンターのログファイル程度であれば ############################## $tmp = "\nカウント : \[ $pcount \]\n日 時 : \[ $time \]\n"; open(DATA,"+<$logfile2"); @array = <DATA>; unshift @array, $tmp; seek(DATA,0,0); print DATA @array; close DATA ; ############################### ということも"あり"です。 ただし,ファイルサイズが大きくなると,それなりに処理に時間がかかってしまいますので,お気をつけて。
その他の回答 (1)
- sakusaker7
- ベストアンサー率62% (800/1280)
残念ながらすでにあるファイルの先頭にデータを追加するとか、途中にデータを割り込ませる ということはできません。 ですので、 ・新しくファイルをオープンして ・追記したいデータを書き込み ・古いファイルの内容をその後ろにコピーする ・古いファイルを削除 ・新しいファイルを古いファイルの名前でセーブする というような手順をとる必要があります。 もし古いファイルの大きさがそれほどでもないのなら、 ・読み書き可能モードでファイルをオープン ・ファイルの内容を全部読み出して変数に格納しておき ・ファイルポインタを先頭に戻して ・追加したいデータを書き出して ・最初に読み取ったデータをその後に書き戻す というやり方でもよいでしょう。 モジュールを使ってよいのなら、Tie::Fileが使えます。 http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq5.html#how_do_i_change_one_line_in_a_file_delete_a_line_in_a_file_insert_a_line_in_the_middle_of_a_file_append_to_the_beginning_of_a_file Tie::File - Access the lines of a disk file via a Perl array - search.cpan.org http://search.cpan.org/~mjd/Tie-File-0.96/lib/Tie/File.pm
お礼
sakusaker7さん、こんにちは。 簡単にはできなさそうですね。 カウンタのデータを見るのにいちいち、最後尾までスクロールするのが面倒だったので簡単に変更できればと思ったのです。 もっと勉強してモジュールのことがわかってから、つくります。 どうもありがとうございました。
お礼
maniacpapaさん、アドバイスありがとうございます。 サイズが大きくなると、処理時間がかかるという点、全てのデータを残す必要はないため、spliceで対処できそうな気がします。 どうもありがとうございました。