[PHP-users 27050] File I/O

tome34 nito @ a2.mbn.or.jp
2005年 10月 3日 (月) 16:14:00 JST


FileのI/Oがうまくいかないのでお尋ねします。

OS:FC1 Apache2 PHP4.3

ブラウザから入力されたデータをファイルに書き込むだけの処理です。
最新の入力を常に1レコードめにするため書込み要求があった場合、現在
のレコードを1レコードずつ後方へローテーションして入力されたデータを
1レコードめに書き込みます。
レコード数は20件ですので20レコードめは新しい書き込みで順次消えて行き
ます。
問題はデータを<textarea>を使って入力しているため改行が送られてくる
ので過去ログを参考にそれを置換えて書込みしているのですが、書込みは
ファイル内を見る限りうまくできていると思うのですが、元の改行に戻す時
がうまく出来ていないみたいです。

だいたいソースは以下のような感じです。
フィールド間はTABで区切っています。
書込み時には"\n"と"\r"を"\\n"と"\\r"に置換えます。
エディッタでファイルを覗くと1レコードめは"\n"または"\r"と表示される
のでうまく出来ているようです。
読込み時には"\\n"と"\\r"を"\n"と"\r"戻しているつもりなのですが、
ファイルを覗くと2レコードめでは"\\n"と"\\r"、3レコードめでは
"\\\n"と"\\\r"と言うように"\"マークが1つずつ増えて行きます。
たぶん読み込み時の戻し方が失敗しているので1つずつ増えているんだと思う
のですが、、、
正規表現の理解が今一不完全でどうすればよいのか苦戦しています。
どなたかご教授頂ければありがたいです。
宜しくお願いします。

Function F_get_dat () {    // 戻り値:読込み件数
   $fp = FOpen("msg.dat", "r+");
   If ($fp <> False) {
       $i = 0;
       While ( !FEof($fp)) {
           $wk = Explode("\t", FGets($fp, 2048));
           $i++;
           Array_key_Exists(0, $wk) ? $this->d_id[$i] = $wk[0] :
$this->d_id[$i] = "";
           Array_key_Exists(1, $wk) ? $w_msg = $wk[1] : $w_msg = "";
           $w_msg1 = Ereg_replace("\\n", "\n", $w_msg);    <---あやしい?
           $w_msg2 = Ereg_replace("\\r", "\r", $w_msg1);    <---あやしい?
           $this->d_msg[$i] = $w_msg2;
       }
       $rt = $i;
   } else {
       $rt = 0;
   }
   FClose($fp);
   Return $rt;
}

Function F_put_dat ($gyo) {
   $fp = FOpen("msg.dat", "w+");
   If ($fp <> False) {
       For ($i = 1; $i <= $gyo; $i++) {
           FWrite($fp, $this->d_id[$i]);
           FWrite($fp, "\t");
           $w_msg1 = Ereg_replace("\n", "\\n", $this->d_msg[$i]);
           $w_msg2 = Ereg_replace("\r", "\\r", $w_msg1);
           FWrite($fp, $w_msg2);
           FWrite($fp, "\n");
       }
       $rt = True;
   } else {
       $rt = False;
   }
   FClose($fp);
   return $rt;
}




PHP-users メーリングリストの案内