プロが教える店舗&オフィスのセキュリティ対策術

編集機能を掲示板につけているところです。
テキストファイルの内容がまったく消えてしまうのです。
どうしてでしょうか?

データ形式

314:2006年2月20日(月)22時31分:あああ:いいい:ううう
313:2006年2月20日(月)22時31分:あああ:いいい:ううう
312:2006年2月18日(土)23時18分:あああ:いいい:ううう

#コード↓########################################

open(KEIJI, ">keijiban.dat") || die "File 'keijiban.dat' Open Error.";

@all = <KEIJI>;

$num = $all[0] + 1 if( $num eq '' );
$title = &henkan($form{'title'});
$topic = $form{'topic'};
$message= $form{'message'};

#***** 文字列の置換 *****
$message =~ s/\r\n/<BR>/g;


# 日本語表記の日時を得るサブルーチン
$time = &jp_time if( $time eq '' );

# 重複があったら置き換えるルーチン

foreach(@all){

$data = $_;
chop $data;

( $fnum ) = ( split(/:/,$data) )[0];
if ( $fnum == $num ) {
$data = "$num:$time:$title:$topic:$message\r\n";
&jcode'convert(*data, 'sjis');
}

push @all, $data;
}

die "File 'keijiban.dat' Open Error.";

flock(KEIJI, 2);

foreach (@all){
print KEIJI $_,"\n";
}

flock(KEIJI, 8);

close(KEIJI);

~~~~~~~~~~~~~~~~~~~~~~~~

どんどん手をつけていったら書きこめなくなってしまいました。最初は書き込めていたんですけど・・・。
真ん中あたりのじ「重複があったらおきかえるルーチン」を付け加えていたら書き込めなくなりました。書き込めたときはpushではなくunshiftを使っていました。

A 回答 (1件)

open(KEIJI, ">keijiban.dat") || die "File 'keijiban.dat' Open Error.";



として、ファイルを開いた時点で中身が消えます。

open(KEIJI,"<keijiban.dat")

として開いて、データを読み込んだ後に処理をしましょう。

この回答への補足

ちなみに最初のOPENとCLOSEで間違っていることはわかりました。この開き方ではどうしてだめなんでしょうか?

補足日時:2006/09/04 15:36
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

そのへんを変えてみたところ内部エラーが出てしまいました。

これで書き込みモードとかのopen方法はあっていると思うのですが、どこがおかしいのかわかりません。

図ずうしいですが、もしわかったら教えてください。

open(KEIJI, "keijiban.dat") || die "File 'keijiban.dat' Open Error.";
# 過去のデータを全て配列に読み込む
@all = <KEIJI>;

# HTMLタグと衝突する記号などを変換

$num = $all[0] + 1 if( $num eq '' );
$title = &henkan($form{'title'});
$topic = $form{'topic'};
$message= $form{'message'};

#***** 文字列の置換 *****
$message =~ s/\r\n/<BR>/g;


# 日本語表記の日時を得るサブルーチン
$time = &jp_time if( $time eq '' );

# データを1行にまとめる(項目の区切りはコロン)


foreach(@all){

$data = $_;
chop $data;

( $fnum ) = ( split(/:/,$data) )[0];
if ( $fnum == $num ) {
$data = "$num:$time:$title:$topic:$message\r\n";
&jcode'convert(*data, 'sjis');
}

push @all, $data;
}

close(KEIJI);

open(KEIJI, ">keijiban.dat") || die "File 'keijiban.dat' Open Error.";

flock(KEIJI, 2);

# (新規データ+過去データ)をファイルに上書き
  print KEIJI @all;

flock(KEIJI, 8);

close(KEIJI);

お礼日時:2006/09/04 15:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!