fgetc()
La fonction fgetc() en PHP lit un seul caractère depuis un pointeur de fichier. Essentielle pour les développeurs web et administrateurs serveur.
Introduction à la fonction fgetc() en PHP
La fonction fgetc() en PHP lit exactement un caractère depuis un fichier ouvert et avance le pointeur de fichier d'un octet vers l'avant. Le nom signifie « file get character » (obtenir un caractère du fichier). Chaque appel retourne le caractère suivant, ce qui permet de parcourir un fichier caractère par caractère en appelant la fonction de manière répétée.
Vous ferez appel à fgetc() lorsque vous avez besoin d'un contrôle fin, caractère par caractère — par exemple, pour construire un petit analyseur syntaxique, compter des caractères spécifiques, ou vous arrêter dès que vous atteignez un octet particulier. Pour la lecture de fichiers courante, fgets() par lignes ou fread()/file_get_contents() pour un fichier entier sont plus rapides et plus simples, car chaque appel à fgetc() entraîne un surcoût d'appel de fonction. Savoir quand ne pas l'utiliser est aussi important que savoir comment l'utiliser.
Cette page couvre la syntaxe, les paramètres, la valeur de retour, des exemples exécutables et les pièges courants (notamment le piège "0" en fin de fichier).
Syntaxe
fgetc(resource $stream): string|falseLa fonction prend un seul argument et retourne soit le caractère lu, soit false.
Paramètres
| Paramètre | Requis | Description |
|---|---|---|
$stream | Oui | Un pointeur de fichier ouvert. Ce doit être une ressource valide retournée par fopen(), fsockopen(), popen(), ou une fonction similaire — pas un nom de fichier. |
Le type
resourcereste entièrement pris en charge en PHP 8+. Aucune modification n'est nécessaire pour la compatibilité moderne.
Valeurs de retour
- En cas de succès, retourne une string contenant un seul caractère lu depuis le fichier.
- Retourne
falselorsque la fin du fichier (EOF) est atteinte ou en cas d'erreur.
Exemples
Exemple 1 : Lire un seul caractère depuis un fichier
Cette opération lit uniquement le premier caractère du fichier. Vérifiez toujours que fopen() a réussi avant d'utiliser le handle, et appelez fclose() lorsque vous avez terminé.
<?php
$fileHandle = fopen('example.txt', 'r');
if ($fileHandle) {
echo fgetc($fileHandle); // prints the first character
fclose($fileHandle);
}Exemple 2 : Lire un fichier entier caractère par caractère
Pour lire l'intégralité du fichier, appelez fgetc() dans une boucle et arrêtez-vous quand elle retourne false (EOF).
<?php
$fileHandle = fopen('example.txt', 'r');
if ($fileHandle) {
while (($char = fgetc($fileHandle)) !== false) {
echo $char;
}
fclose($fileHandle);
}Ce code affiche chaque caractère du fichier jusqu'à la fin de fichier.
Pourquoi !== false est important (le piège du « 0 »)
Un bug très courant consiste à écrire la boucle avec une comparaison lâche :
// BUGGED: stops early on the first "0" or "" it reads
while ($char = fgetc($fileHandle)) {
echo $char;
}PHP traite les chaînes "0" et "" comme des valeurs fausses. Si votre fichier contient un caractère 0, cette boucle se termine là au lieu de continuer jusqu'à EOF. Utilisez toujours la comparaison stricte d'identité !== false afin que seule la vraie valeur EOF arrête la boucle. La même règle s'applique à fgets() et fread().
Exemple 3 : Compter les occurrences d'un caractère
Comme fgetc() vous donne un caractère à la fois, elle est pratique pour des comptages en flux continu sans charger l'intégralité du fichier en mémoire :
<?php
$fileHandle = fopen('example.txt', 'r');
$vowels = 0;
if ($fileHandle) {
while (($char = fgetc($fileHandle)) !== false) {
if (str_contains('aeiouAEIOU', $char)) {
$vowels++;
}
}
fclose($fileHandle);
echo "Vowels: $vowels";
}fgetc() vs fgets() vs fread()
| Fonction | Lit | À utiliser quand |
|---|---|---|
fgetc() | Un caractère | Vous avez besoin d'un contrôle au niveau du caractère ou souhaitez vous arrêter à un octet spécifique |
fgets() | Une ligne (jusqu'à un retour à la ligne) | Vous traitez du texte ligne par ligne |
fread() | Un nombre fixe d'octets | Vous lisez des données binaires ou de grands blocs d'un coup |
Pour les fichiers binaires, préférez fread() — boucler avec fgetc() fonctionne mais est bien plus lent par octet.
Notes et pièges
fgetc()fonctionne sur des flux sûrs pour les données binaires : elle retourne un octet même pour les caractères non textuels. Les caractères UTF-8 multi-octets s'étendent sur plusieurs octets, donc un seul appel àfgetc()peut ne retourner qu'une partie d'un tel caractère.- Ouvrez le fichier avec le bon mode (
'r','rb', etc.) viafopen(), et n'oubliez pas de le fermer avecfclose(). - Vous pouvez également tester la fin de fichier explicitement avec
feof(), bien que comparerfgetc()àfalsesoit généralement suffisant.
Conclusion
fgetc() lit un caractère à la fois depuis un pointeur de fichier ouvert et retourne false en fin de fichier, ce qui en fait un outil idéal pour l'analyse et le comptage au niveau des caractères. Retenez simplement les deux essentiels : passez une ressource ouverte depuis fopen(), et terminez votre boucle de lecture avec la vérification stricte !== false pour qu'un 0 littéral ne vous arrête jamais prématurément. Pour un traitement par lignes ou par blocs, préférez fgets() ou fread().
Pour en savoir plus sur la gestion des fichiers en PHP, consultez le guide Gestion des fichiers PHP.