Как я могу определить, в какой строке файлового ресурса в данный момент “включен” PHP?

StackOverflow https://stackoverflow.com/questions/1352598

  •  20-09-2019
  •  | 
  •  

Вопрос

Используя PHP, можно считывать содержимое файла с помощью fopen и fgets.Каждый раз, когда fgets вызывается, он возвращает следующую строку в файле.

Как это fgets знать какую строчку прочесть?Другими словами, откуда он знает, что в последний раз он прочитал строку 5, поэтому на этот раз он должен вернуть содержимое строки 6?Есть ли у меня способ получить доступ к этим данным с номером строки?

(Я знаю, что можно сделать что-то подобное, прочитав все содержимое файла в массив с file, но я хотел бы достичь этого с помощью fopen.)

Это было полезно?

Решение

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

Вы можете получить эту должность с ftell, и модифицируйте его с помощью fseek :

ftell — Возвращает текущее положение указателя чтения/записи файла

fseek — Выполняет поиск по указателю на файл

Вы также можете использовать перемотать назад Для...перемотать назад...положение этого указателя.


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


КСТАТИ :насколько я помню, эти функции взяты из языка C - сам PHP написан на C ;-)

Другие советы

Файлы - это просто поток данных, прочитанный от начала до конца.Операционная система запомнит позицию, которую вы уже прочитали в этом файле.При необходимости сделать это и в приложении довольно просто.Однако ОС заботится только о позициях байтов, а не о строках.

Просто представьте, что последовательно раздаете колоду из 52 карт.Вы сдаете первую карту.В следующий раз 2.карточка.Когда вы хотите раздать 3.карта, вам не нужно начинать отсчет с самого начала или даже вспоминать, где вы были, вы просто раздаете следующую доступную карту, и это будет третья.

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

Ни PHP, ни ОС не имеют реальной необходимости сохранять номер строки, поскольку все, о чем заботится система, - это "следующая строка".Если вы хотите узнать номер строки, вы сохраняете счетчик и увеличиваете его каждый раз, когда ваше приложение считывает строку.

$lineno=0;
while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    lineno++; // keep track of the line number
     ...

}

у меня есть этот старый образец, я думаю, он может вам помочь :)

$File = file('path');
$array = array();

$linenr = 5;

foreach( $File AS $line_num => $line )
{
$array = array_push( $array , $line );
}

echo $array[($linenr-1)];

Ты мог бы просто позвонить fgets и увеличьте переменную $line_number каждый раз, когда вы это вызываете.Это подсказало бы вам, на какой линии он находится.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top