日本PHPユーザ会 掲示板

日本PHPユーザ会運営の掲示板です。※ただいまテスト運用中です。

日本PHPユーザ会 掲示板 » PHP事はじめ » ファイルの書き込みについて教えてください

ファイルの書き込みについて教えてください

ページ: 1

投稿者 投稿
会員
登録者: 1 2010
返信数: 1
fopenやfseek、そしてfputsを使いいろいろ試してみたのですが、
なかなかうまくいきません。

やろうとしてるのはファイルの終端から10byte前に追記するような処理です。
ファイルをa+でfopenするとfseekを使うかどうかにかかわらずファイルの終端に追記
してしまい、w+でfopenするとそれまでの内容が消えてしまいます。
w+で一度fopenしてそれまでのファイルをすべて読み込み、すべて書き込みなおした後で
新たに追記するしかないのでしょうか?
会員
登録者: 8 2009
返信数: 103
こんにちは。
r+モードは試してみましたか?

<?php

$fileo = "overwrite.dat";
$filei = "insert.dat";
$length = 10;
$strings = "abcdefghijklmnopqrstuvwxyz";
$add_strings = "012";



file_put_contents($fileo, $strings);

$fp = fopen($fileo, "r+");
if(fseek($fp, -$length, SEEK_END) == 0) {
fwrite($fp, $add_strings);
}
fclose($fp);

print "overwrite: " . $strings . " -> " . file_get_contents($fileo) . "\n";



file_put_contents($filei, $strings);

$fp = fopen($filei, "r+");
if(fseek($fp, -$length, SEEK_END) == 0) {
$data = fread($fp, $length);
if(fseek($fp, -$length, SEEK_END) == 0) {
fwrite($fp, $add_strings . $data);
}
}
fclose($fp);

print " insert: " . $strings . " -> " . file_get_contents($filei) . "\n";

?>
会員
登録者: 1 2010
返信数: 7
マルチポストでしょうか?
引用
494 :nobodyさん:2010/01/28(木) 22:18:48 ID:2KkwWo9K
テキストファイルのしゅうたんから10バイト前の位置に追記するにはどうすればいいですか


スマートなやり方ではないかもしれませんが、

/*追記したい文字を$insert 、テキストファイルをphpと同じディレクトリの
"textfile.txt"と仮定した上で書きます*/

//ファイルが読み書き可能かのチェック
if (is_readable("./textfile.txt") && is_writable("./textfile.txt")){

//テキストファイルの取得
$text = file_get_contents('./textfile.txt');

//テキストファイルの長さを取得
$length = strlen($text);

//末尾から10バイト目の長さを取得
$split_point = $length-10;

//追記したい文の前に来る文字[先頭-末尾から10byte除いた長さ]
$text_prefix = substr(0, $split_point, $text);

//追記したい文の後に来る文字[末尾から10byte目-末尾]
$text_suffix = substr($split_point, $length, $text);

//これらの3つの文字をつなぎ合わせる
$inserted = $text_prefix.$insert.$text_suffix;

//ファイルを書き戻す
file_put_contents("./textfile.txt", $inserted);

}else{
//読み込みまたは書き込みが出来ない場合
die("テキストファイルの読み込み、または書き込みに失敗しました。");
}



コードの正当性は検証していませんが、こんな所でしょうか。

ページ: 1

日本PHPユーザ会 掲示板 » PHP事はじめ » ファイルの書き込みについて教えてください

日本PHPユーザ会 掲示板 は UseBB 1 フォーラムソフトウェア を使用しています