W3docs

feof()

A função feof() em PHP verifica se o final de um arquivo foi atingido. É essencial para leitura segura de arquivos.

Introdução à Função feof() do PHP

A função feof() em PHP verifica se o fim de arquivo (EOF) foi atingido em um ponteiro de arquivo aberto. Ao ler um arquivo com funções como fgets() ou fread(), o PHP mantém um cursor interno que avança a cada leitura. feof() retorna true assim que uma leitura tenta avançar além do último byte.

Esta página aborda a sintaxe de feof(), a principal sutileza que confunde a maioria das pessoas (quando exatamente ela retorna true), o padrão de loop recomendado e um erro comum a evitar.

Se você é iniciante em abertura e leitura de arquivos, comece com Abrir e ler um arquivo em PHP.

Sintaxe

A sintaxe da função feof() é a seguinte:

A sintaxe PHP de feof()

bool feof ( resource $stream )
  • $stream: o ponteiro de arquivo (um recurso) a ser verificado.
  • Retorna: booltrue se o ponteiro de arquivo estiver no fim do arquivo ou se ocorreu um erro, false caso contrário.

Parâmetros

A função feof() recebe um parâmetro obrigatório:

  1. $stream: O ponteiro de arquivo que você deseja verificar. Deve ser um recurso válido aberto com fopen() (ou uma função de stream similar) e ainda estar aberto — passar um ponteiro que já foi fechado com fclose(), ou qualquer coisa que não seja um recurso, gera um aviso.

Como o EOF é detectado (a armadilha principal)

feof() não faz leitura antecipada. Ela só retorna true depois que uma função de leitura como fgets() ou fread() já tentou ler além do fim do arquivo:

  • Verificar feof() imediatamente após fopen(), antes de qualquer leitura, sempre retorna false — mesmo em um arquivo vazio.
  • Um arquivo que termina com uma nova linha só é totalmente consumido quando a leitura após a última linha não retorna nada; essa leitura final é o que muda feof() para true.

Por causa disso, a forma robusta de ler um arquivo é testar o valor de retorno da função de leitura, e não apenas feof(). Em um stream não-buscável (um socket de rede ou pipe), feof() também pode retornar true somente após o fechamento da conexão, portanto confiar no resultado da leitura é mais seguro nesses casos também.

Exemplos

Aqui estão alguns exemplos de como usar a função feof():

Exemplo 1: Verificar se o fim de um arquivo foi atingido após uma leitura

O exemplo a seguir lê a primeira linha do arquivo e depois verifica se o fim foi atingido:

Verificar se o fim de um arquivo foi atingido em PHP

<?php

$fileHandle = fopen("example.txt", "r");
// Read the first line
$firstLine = fgets($fileHandle);

// Now check if we've reached the end
if (feof($fileHandle)) {
  echo "End of file reached";
} else {
  echo "End of file not reached";
}
fclose($fileHandle);
?>

Exemplo 2: Padrão de loop padrão (recomendado)

A forma mais limpa e segura de ler um arquivo linha por linha é fazer um loop com base no valor de retorno de fgets() — ela retorna false no fim do arquivo, portanto não é necessário chamar feof() explicitamente. Esse padrão também evita a armadilha do loop infinito descrita abaixo:

Loop de leitura padrão em PHP

<?php

$fileHandle = fopen("example.txt", "r");
if ($fileHandle === false) {
  die("Error: Could not open file.");
}

while (($line = fgets($fileHandle)) !== false) {
  echo $line;
}
fclose($fileHandle);
?>

Isso imprime cada linha do arquivo até que o fim seja atingido.

Exemplo 3: Uma demonstração autossuficiente e executável

Este exemplo cria um arquivo temporário, escreve três linhas e depois o lê com feof() para que você veja exatamente quando o EOF muda para true:

Demonstrando o comportamento de feof()

<?php

$path = tempnam(sys_get_temp_dir(), "demo");
file_put_contents($path, "line 1\nline 2\nline 3\n");

$fh = fopen($path, "r");
var_dump(feof($fh)); // false — nothing read yet

while (!feof($fh)) {
  $line = fgets($fh);
  if ($line === false) {
    break; // read failed / past EOF
  }
  echo "Read: " . trim($line) . "\n";
}

var_dump(feof($fh)); // true — last read passed EOF
fclose($fh);
unlink($path);
?>

Saída esperada:

bool(false)
Read: line 1
Read: line 2
Read: line 3
bool(true)

Erro comum: o loop infinito

Chamar fgets() sem verificar seu valor de retorno dentro de um loop while (!feof($fh)) é arriscado. Se ocorrer um erro de leitura (ou se o stream nunca reportar EOF), feof() nunca se torna true e o loop roda para sempre. Sempre combine a verificação de EOF com o resultado da leitura — ou, mais simples, faça o loop diretamente em fgets() como no Exemplo 2.

Funções relacionadas

  • fopen() — abrir o arquivo e obter o ponteiro que feof() verifica.
  • fgets() — ler uma linha por vez.
  • fread() — ler um número fixo de bytes.
  • fclose() — fechar o ponteiro quando terminar.

Conclusão

A função feof() indica se uma leitura passou do fim de um arquivo aberto. A regra mais importante é que ela só se torna true após uma tentativa de leitura, portanto os loops de arquivo mais seguros testam o valor de retorno de fgets() ou fread() diretamente. Com esse padrão, você evita tanto saídas prematuras quanto loops infinitos.

Prática

Prática
Qual é o principal objetivo da função 'feof()' em PHP?
Qual é o principal objetivo da função 'feof()' em PHP?
Was this page helpful?