feof()
La fonction feof() en PHP vérifie si la fin d'un fichier a été atteinte. Essentielle pour lire des fichiers en toute sécurité.
Introduction à la fonction PHP feof()
La fonction feof() en PHP vérifie si la fin de fichier (EOF) a été atteinte sur un pointeur de fichier ouvert. Lorsque vous lisez un fichier avec des fonctions telles que fgets() ou fread(), PHP maintient un curseur interne qui avance à chaque lecture. feof() renvoie true dès qu'une lecture a tenté de dépasser le dernier octet.
Cette page couvre la syntaxe de feof(), la subtilité qui piège la plupart des gens (à quel moment exactement elle renvoie true), le modèle de boucle recommandé, et une erreur courante à éviter.
Si vous débutez avec l'ouverture et la lecture de fichiers, commencez par Ouvrir et lire un fichier en PHP.
Syntaxe
La syntaxe de la fonction feof() est la suivante :
La syntaxe PHP de feof()
bool feof ( resource $stream )$stream: le pointeur de fichier (une ressource) à vérifier.- Retourne :
bool—truesi le pointeur de fichier est à la fin du fichier ou si une erreur s'est produite,falsesinon.
Paramètres
La fonction feof() prend un seul paramètre obligatoire :
$stream: Le pointeur de fichier que vous souhaitez vérifier. Il doit s'agir d'une ressource valide ouverte avecfopen()(ou une fonction de flux similaire) et encore ouverte — passer un pointeur déjà fermé avecfclose(), ou tout ce qui n'est pas une ressource, génère un avertissement.
Comment l'EOF est détecté (le piège principal)
feof() ne regarde pas en avant. Elle ne renvoie true qu'après qu'une fonction de lecture telle que fgets() ou fread() a déjà tenté de lire au-delà de la fin du fichier :
- Vérifier
feof()immédiatement aprèsfopen(), avant toute lecture, renvoie toujoursfalse— même pour un fichier vide. - Un fichier qui se termine par un saut de ligne n'est entièrement consommé que lorsque la lecture après la dernière ligne ne renvoie rien ; c'est cette dernière lecture qui fait passer
feof()àtrue.
Pour cette raison, la méthode robuste pour lire un fichier est de tester la valeur de retour de la fonction de lecture, et non feof() seule. Sur un flux non seekable (une socket réseau ou un pipe), feof() peut également ne renvoyer true qu'après la fermeture de la connexion, donc s'appuyer sur le résultat de la lecture est aussi plus sûr dans ce cas.
Exemples
Voici quelques exemples d'utilisation de la fonction feof() :
Exemple 1 : Vérifier si la fin d'un fichier a été atteinte après une lecture
L'exemple suivant lit la première ligne du fichier, puis vérifie si la fin a été atteinte :
Vérifier si la fin d'un fichier a été atteinte en 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);
?>Exemple 2 : Modèle de boucle standard (recommandé)
La façon la plus propre et la plus sûre de lire un fichier ligne par ligne est de boucler sur la valeur de retour de fgets() — elle renvoie false en fin de fichier, donc vous n'avez même pas besoin d'appeler feof() explicitement. Ce modèle évite également le piège de la boucle infinie décrit ci-dessous :
Boucle de lecture standard en 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);
?>Cela affiche chaque ligne du fichier jusqu'à la fin.
Exemple 3 : Une démonstration autonome et exécutable
Cet exemple crée un fichier temporaire, écrit trois lignes, puis le relit avec feof() pour que vous puissiez voir exactement quand l'EOF passe à true :
Démonstration du comportement 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);
?>Résultat attendu :
bool(false)
Read: line 1
Read: line 2
Read: line 3
bool(true)Erreur courante : la boucle infinie
Appeler fgets() sans vérifier sa valeur de retour dans une boucle while (!feof($fh)) est risqué. Si une erreur de lecture se produit (ou si le flux ne signale jamais l'EOF), feof() ne devient jamais true et la boucle tourne indéfiniment. Combinez toujours la vérification EOF avec le résultat de la lecture — ou, plus simplement, bouclez directement sur fgets() comme dans l'exemple 2.
Fonctions associées
fopen()— ouvre le fichier et obtient le pointeur quefeof()vérifie.fgets()— lit une ligne à la fois.fread()— lit un nombre fixe d'octets.fclose()— ferme le pointeur lorsque vous avez terminé.
Conclusion
La fonction feof() indique si une lecture a dépassé la fin d'un fichier ouvert. La règle la plus importante est qu'elle ne passe à true qu'après une tentative de lecture, donc les boucles de fichiers les plus sûres testent directement la valeur de retour de fgets() ou de fread(). Avec ce modèle, vous évitez à la fois les sorties prématurées et les boucles infinies.