Como posso dizer em que linha um recurso de arquivo está atualmente "ligado" no PHP?

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

  •  20-09-2019
  •  | 
  •  

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.)

Foi útil?

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á.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top