W3docs

fgets()

La fonction fgets() en PHP lit une ligne depuis un fichier ouvert et la retourne sous forme de string.

La fonction fgets() lit une ligne à la fois depuis un descripteur de fichier ouvert. C'est la manière standard de traiter des fichiers texte en PHP sans charger le fichier entier en mémoire — ce qui importe lorsqu'un fichier est assez grand pour que le lire en une seule fois (avec file_get_contents() ou fread()) serait inutilement coûteux ou impossible.

Cette page couvre la syntaxe, ce que retourne fgets(), la boucle de lecture correcte, les pièges courants et son rapport aux autres fonctions de lecture de fichiers.

Qu'est-ce que la fonction fgets() ?

fgets() lit depuis la position courante d'un descripteur de fichier ouvert jusqu'à inclus le prochain caractère de saut de ligne (\n), et retourne ce texte sous forme de string. Elle avance ensuite le pointeur de fichier pour que l'appel suivant lise la ligne suivante.

Elle ne se limite pas aux fichiers sur disque : tout flux ouvert avec fopen() fonctionne, y compris php://stdin pour lire une saisie clavier et des URLs distantes.

Syntaxe

fgets(resource $stream, ?int $length = null): string|false
  • $stream — un pointeur de fichier retourné par fopen() (ou une autre fonction de flux). Il doit être encore ouvert.
  • $length (optionnel) — lit au maximum $length - 1 octets. La lecture s'arrête lorsqu'un saut de ligne est atteint, que la fin du fichier est atteinte, ou que $length - 1 octets ont été lus, selon ce qui arrive en premier. Omettez-le pour lire jusqu'à la fin de la ligne quelle que soit sa longueur.

Ce que retourne fgets()

SituationValeur de retour
Une ligne a été lueLa ligne sous forme de string, avec le \n final inclus
Déjà à la fin du fichierfalse
Une erreur s'est produitefalse

Comme le saut de ligne est conservé, echo reproduit les sauts de ligne du fichier. Si vous n'en voulez pas, supprimez-les avec rtrim($line, "\r\n").

Le fait que fgets() retourne false en fin de fichier est ce qui fait fonctionner la boucle de lecture ci-dessous — vous n'avez même pas besoin de feof().

Comment utiliser fgets() : les trois étapes

  1. Ouvrir le fichier avec fopen() dans un mode de lecture tel que "r".
  2. Lire ligne par ligne avec fgets().
  3. Fermer le descripteur avec fclose() lorsque c'est terminé.

La boucle de lecture recommandée

Le schéma le plus propre utilise la valeur de retour false comme condition de boucle. L'affectation en PHP est évaluée à la valeur affectée, donc while (($line = fgets($file)) !== false) lit une ligne et la teste en une seule étape :

<?php

$file = fopen("file.txt", "r");

if ($file === false) {
    exit("Could not open the file.\n");
}

while (($line = fgets($file)) !== false) {
    echo $line;          // newline is already part of $line
}

fclose($file);

La comparaison stricte !== false est importante : une ligne contenant uniquement "0" est considérée comme « falsy » en PHP, donc un simple while ($line = fgets($file)) s'arrêterait prématurément sur cette ligne. Comparez toujours avec !== false.

Lecture ligne par ligne avec feof()

Vous verrez également la boucle écrite avec feof(), qui retourne true une fois la fin du fichier atteinte :

<?php

$file = fopen("file.txt", "r");

while (!feof($file)) {
    $line = fgets($file);
    if ($line === false) {
        break;          // guard against a read failure mid-loop
    }
    echo $line;
}

fclose($file);

Les deux styles sont corrects. La version !== false est généralement préférée car feof() ne devient true qu'après qu'une lecture a échoué, ce qui peut provoquer une itération vide supplémentaire si vous n'y faites pas attention.

Limiter la longueur de ligne

Passez $length pour limiter la quantité d'une longue ligne lue à la fois. Ici, seuls les 9 premiers octets ($length - 1) de chaque morceau sont retournés :

<?php

$file = fopen("file.txt", "r");

// "Hello, world!" is read in pieces of at most 9 bytes
echo fgets($file, 10);   // "Hello, wo"
echo "\n";
echo fgets($file, 10);   // "rld!" (rest of the line)

fclose($file);

C'est pratique pour se protéger contre des lignes pathologiquement longues, mais pour les fichiers texte ordinaires vous pouvez omettre $length.

Lire la saisie utilisateur depuis le terminal

Comme fgets() fonctionne sur n'importe quel flux, c'est la manière classique de lire une ligne saisie par l'utilisateur en ligne de commande :

<?php

echo "What is your name? ";
$name = rtrim(fgets(STDIN), "\r\n");  // strip the Enter key's newline
echo "Hello, $name!\n";

STDIN est une constante prédéfinie pour php://stdin.

Pièges courants

  • Le saut de ligne final est inclus. Utilisez rtrim($line, "\r\n") lorsque vous comparez ou stockez des valeurs.
  • Testez avec !== false, pas seulement la véracité, pour que les lignes comme "0" ou "" n'interrompent pas la boucle prématurément.
  • fgets() nécessite un descripteur valide et ouvert. Si fopen() a retourné false (fichier manquant, mauvaises permissions), lui passer ce résultat déclenche un avertissement. Vérifiez d'abord le descripteur.
  • N'oubliez pas fclose(). PHP ferme les descripteurs en fin de script, mais les libérer explicitement est une bonne pratique, surtout dans les scripts de longue durée.
  • Pour les lectures de fichiers entiers, préférez des outils plus simples. Si vous n'avez pas besoin d'un contrôle ligne par ligne, file() retourne le fichier sous forme d'un array de lignes et file_get_contents() le retourne comme une seule string.

Fonctions associées

  • fopen() — ouvre un fichier ou un flux (requis avant fgets()).
  • fread() — lit un nombre fixe d'octets, pas de lignes.
  • fgetc() — lit un seul caractère.
  • fgetcsv() — lit une ligne et la traite comme du CSV.
  • feof() — teste la fin de fichier.
  • fclose() — ferme le descripteur.

Conclusion

fgets() lit un fichier une ligne à la fois, retournant chaque ligne (saut de ligne inclus) jusqu'à atteindre la fin du fichier, où elle retourne false. Associez-la à fopen() et fclose(), pilotez la boucle avec un test strict !== false, et pensez à appliquer rtrim() sur le saut de ligne lorsque vous avez besoin de la valeur nette. Pour les très grands fichiers, cela maintient une utilisation mémoire constante, faisant de fgets() le choix incontournable pour le traitement en flux de texte en PHP.

Pratique

Pratique
Que fait la fonction fgets() en PHP ?
Que fait la fonction fgets() en PHP ?
Was this page helpful?