Строка перезаписи в файле с PHP

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

17
задан tshepang 31 January 2014 в 15:40
поделиться

5 ответов

Если бы файл не является слишком большим, лучший способ состоял бы в том, чтобы, вероятно, считать файл в массив строк с файл () , перерыть массив строк для Вашей строки и отредактировать ту строку, то интегрируются () массив назад вместе и fwrite () это назад в файл.

18
ответ дан 30 November 2019 в 11:18
поделиться

Вашей основной проблемой является то, что новая строка не может быть той же длиной как старая строка. Если необходимо изменить длину строки, нет никакого выхода из перезаписи по крайней мере всего файла после измененной строки. Самый легкий путь состоит в том, чтобы создать новый, измененный файл и затем переместить его через оригинал. Таким образом, там является полный файл, доступный в любом случае читателям. Используйте блокировку, чтобы удостовериться, что только один сценарий изменяет файл сразу, и так как Вы собираетесь заменить файл, сделайте блокировку на другом файле. Выезд flock().

, Если Вы уверены, что новая строка будет той же длиной как старая строка, можно открыть файл в режиме чтения-записи (использование r+ как второй аргумент fopen()) и вызов ftell() для сохранения положения, которое строка запускает каждый раз перед вызовом fgets() для чтения строки. После того как Вы находите строку, которую Вы хотите перезаписать, можно использовать fseek() для возвращения к началу строки и fwrite() новые данные. Один способ вынудить строку всегда быть той же длиной состоит в том, чтобы расположить с интервалами, увеличивают его к максимальной возможной длине.

5
ответ дан 30 November 2019 в 11:18
поделиться

Если файл является действительно большим (файлы журнала или что-то вроде этого), и Вы готовы пожертвовать скоростью за потребление памяти, Вы могли открыть два файла и по существу добиться цели Jeremy Ruten предложенный при помощи файлов вместо системной памяти.

$source='in.txt';
$target='out.txt';

// copy operation
$sh=fopen($source, 'r');
$th=fopen($target, 'w');
while (!feof($sh)) {
    $line=fgets($sh);
    if (strpos($line, '@parsethis')!==false) {
        $line='new line to be inserted' . PHP_EOL;
    }
    fwrite($th, $line);
}

fclose($sh);
fclose($th);

// delete old source file
unlink($source);
// rename target file to source file
rename($target, $source);
20
ответ дан 30 November 2019 в 11:18
поделиться

или если Ваш файл не является слишком большим:

$sample = file_get_contents('sample');
$parsed =preg_replace('#@parsethis.*#', 'REPLACE TO END OF LINE', $sample);

необходимо будет выбрать разделители '#', которые не присутствуют в файле все же.

0
ответ дан 30 November 2019 в 11:18
поделиться

Я, скорее всего, сделал бы то, что предложенный Jeremy, но только для альтернативного способа сделать это здесь другое решение. Это не тестировалось или использовалось и для *, отклоняют системы.

$cmd = "grep '@parsethis' " . $filename;
$output = system($cmd, $result);
$lines = explode("\n", $result);
// Read the entire file as a string
// Do a str_repalce for each item in $lines with ""
-1
ответ дан 30 November 2019 в 11:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: