замена одной строки .txt файла с помощью php - PullRequest
1 голос
/ 30 сентября 2011

Я пытаюсь использовать вызов php через AJAX для замены одной строки файла .txt, в которой я храню информацию, специфичную для пользователя.Проблема в том, что если я использую fwrite, как только доберусь до нужной строки, она оставляет любую предыдущую информацию, которая длиннее, чем информация о замене, в конце не затрагивается.Есть ли простой способ очистить одну строку в файле .txt с помощью php, который я могу вызвать первым?Пример того, что происходит - допустим, я храню любимого композитора, и у пользователя есть «Бетховен» в их файле .txt, и я хочу изменить его на «Моцарт», когда я использовал fwrite вместо «Бетховен» с «Моцарт»Я получаю "Моцартвен" в качестве новой линии.Я использую "r +" в вызове fopen, так как я хочу заменить только одну строку за раз.

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

Если эти данные конфигурации не нужно делать доступными для приложений, не поддерживающих PHP, рассмотрите возможность использования var_export().Это в основном var_dump / print_r, но выводит переменную в виде разбираемого PHP-кода.Это уменьшит ваш код до:

include('config.php');
$CONFIG['musician'] = 'Mozart';
file_put_contents('config.php', '<?php $CONFIG = ' . var_export($CONFIG, true));
0 голосов
/ 30 сентября 2011

Это код, который я написал некоторое время назад, чтобы удалить строку из файла, его нужно изменить.Кроме того, он будет работать правильно, если новая строка короче старой, для более длинных строк потребуется серьезная модификация.

Ключ - второй цикл while, в котором все содержимое файла после измененияперезаписывается в правильной позиции в файле.

<?php
$size = filesize('test.txt');
$file = fopen('test.txt', 'r+');
$lineToDelete = 3;
$counter = 1;

while ($counter < $lineToDelete) {
   fgets($file); // skip
   $counter++;

}

$position = ftell($file);
$lineToRemove = fgets($file);
$bufferSize = strlen($lineToRemove);
while ($newLine = fread($file, $bufferSize)) {
   fseek($file, $position, SEEK_SET);
   fwrite($file, $newLine);
   $position = ftell($file);
   fseek($file, $bufferSize, SEEK_CUR);

}
ftruncate($file, $size - $bufferSize);
echo 'Done';
fclose($file);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...