Как я могу сказать, какая строка файлового ресурса в данный момент включена в PHP? - PullRequest
0 голосов
/ 30 августа 2009

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

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

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

Ответы [ 4 ]

6 голосов
/ 30 августа 2009

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

Вы можете получить эту позицию с помощью ftell и изменить ее с помощью fseek:

ftell - возвращает текущую позицию указателя чтения / записи файла

fseek - ищет указатель файла

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


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


Кстати: насколько я помню, эти функции происходят из языка Си - сам PHP пишется на Си; -)

3 голосов
/ 30 августа 2009

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

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

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

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

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

}
0 голосов
/ 30 августа 2009

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

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

$linenr = 5;

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

echo $array[($linenr-1)];
0 голосов
/ 30 августа 2009

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

...