Como posso dizer em que linha um recurso de arquivo está atualmente "ligado" no PHP?
Pergunta
Usando PHP, é possível ler o conteúdo de um arquivo usando fopen
e fgets
. Cada vez fgets
é chamado, ele retorna a próxima linha no arquivo.
Como acontece fgets
conhecer Que linha de ler? Em outras palavras, como sabe que a última linha de leitura 5, para que devolva o conteúdo da linha 6 desta vez? Existe uma maneira de eu acessar esses dados do número de linha?
(Eu sei que é possível fazer algo semelhante lendo todo o conteúdo do arquivo em uma matriz com file
, mas eu gostaria de fazer isso com fopen
.)
Solução
Há uma "posição" mantida na memória para cada arquivo que é aberto; É atualizado automaticamente cada vez que você está lendo uma linha/caractere/qualquer que seja do arquivo.
Você pode obter esta posição com ftell
, e modificá -lo com fseek
:
FTELL - Retorna a posição atual do arquivo de leitura/gravação do arquivo
FSEEK - procura um ponteiro de arquivo
Você também pode usar rebobinando para ... rebobinar ... a posição desse ponteiro.
Isso não está fazendo de você uma posição como número de linha, mas mais perto de uma posição como número de personagem (Na verdade, você está obtendo a posição como vários bytes desde o início do arquivo) ; Quando você tem isso, a leitura de uma linha é apenas um encontro de leitura de personagens até que Yu atinja um personagem final da linha.
BTW: Até onde eu me lembro, essas funções vêm do idioma C-o próprio PHP está sendo escrito em C ;-)
Outras dicas
Os arquivos são apenas um fluxo de dados, lido do início ao fim. O sistema operacional se lembrará da posição que você leu até agora nesse arquivo. Se necessário, fazer isso no aplicativo também é bastante simples. O sistema operacional se importa apenas com posições de bytes, não linhas.
Imagine negociar um baralho de 52 cartas sequencialmente. Você entrega a primeira carta. Da próxima vez que o 2. cartão. Quando você deseja distribuir o cartão 3., não precisa começar a contar desde o início novamente, ou mesmo se lembrando de onde você estava apenas distribuindo o próximo cartão disponível, e esse será o terceiro.
Pode ser um pouco mais de trabalho necessário para ler linhas, pois você deseja buffer dados lidos pelo arquivo real para o bem de pré -forma, mas não é muito mais do que gravar o deslocamento dos últimos dados que você Entregue, encontre o próximo caractere nova e entregue todos os dados entre esses 2 pontos.
O PHP nem o sistema operacional não têm necessidade real de manter o número da linha, pois todo o sistema se preocupa é "a próxima linha". Se você quiser saber o número da linha, mantenha um contador e o incrementam toda vez que seu aplicativo lê uma linha.
$lineno=0;
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
lineno++; // keep track of the line number
...
}
Eu tenho essa amostra antiga que eu seu, ele pode ajudá -lo :)
$File = file('path');
$array = array();
$linenr = 5;
foreach( $File AS $line_num => $line )
{
$array = array_push( $array , $line );
}
echo $array[($linenr-1)];
Você poderia simplesmente ligar fgets
e incremento um Var $line_number
Cada vez que você chama. Isso lhe diria a linha em que está.