fgetc()
La función fgetc() en PHP lee un solo carácter desde un puntero de archivo. Esencial para desarrolladores web y administradores de servidor.
Introducción a la función fgetc() de PHP
La función fgetc() en PHP lee exactamente un carácter de un archivo abierto y avanza el puntero de archivo un byte hacia adelante. El nombre proviene de "file get character" (obtener carácter del archivo). Cada llamada devuelve el siguiente carácter, por lo que llamándola repetidamente puedes recorrer un archivo carácter a carácter.
Recurrirás a fgetc() cuando necesites un control preciso, carácter por carácter — por ejemplo, al construir un pequeño analizador, contar caracteres específicos o detenerte en el momento en que encuentres un byte concreto. Para la mayoría de las lecturas de archivos cotidianas, las funciones basadas en líneas como fgets() o las de archivo completo como fread()/file_get_contents() son más rápidas y simples, ya que cada llamada a fgetc() conlleva la sobrecarga de una llamada a función. Saber cuándo no usarla es tan importante como saber cómo hacerlo.
Esta página cubre la sintaxis, los parámetros, el valor de retorno, ejemplos ejecutables y los errores comunes (especialmente la trampa del final de archivo con "0").
Sintaxis
fgetc(resource $stream): string|falseLa función recibe un único argumento y devuelve el carácter leído o false.
Parámetros
| Parámetro | Requerido | Descripción |
|---|---|---|
$stream | Sí | Un puntero de archivo abierto. Debe ser un recurso válido devuelto por fopen(), fsockopen(), popen() o una función similar — no un nombre de archivo. |
El tipo
resourcesigue siendo totalmente compatible con PHP 8+. No se requieren cambios para la compatibilidad moderna.
Valores de retorno
- En caso de éxito, devuelve un string que contiene un solo carácter leído del archivo.
- Devuelve
falsecuando se alcanza el final del archivo (EOF) o en caso de error.
Ejemplos
Ejemplo 1: Leer un solo carácter de un archivo
Esto lee únicamente el primer carácter del archivo. Siempre comprueba que fopen() haya tenido éxito antes de usar el identificador, y llama a fclose() cuando hayas terminado.
<?php
$fileHandle = fopen('example.txt', 'r');
if ($fileHandle) {
echo fgetc($fileHandle); // prints the first character
fclose($fileHandle);
}Ejemplo 2: Leer un archivo completo carácter a carácter
Para leer todo el archivo, llama a fgetc() en un bucle y detente cuando devuelva false (EOF).
<?php
$fileHandle = fopen('example.txt', 'r');
if ($fileHandle) {
while (($char = fgetc($fileHandle)) !== false) {
echo $char;
}
fclose($fileHandle);
}Esto imprime cada carácter del archivo hasta el EOF.
Por qué importa !== false (la trampa del "0")
Un error muy común es escribir el bucle con una comparación laxa:
// BUGGED: stops early on the first "0" or "" it reads
while ($char = fgetc($fileHandle)) {
echo $char;
}PHP trata las cadenas "0" y "" como valores falsy. Si tu archivo contiene un carácter 0, este bucle termina ahí en lugar de en el EOF. Utiliza siempre la comparación estricta de identidad !== false para que solo el valor real de EOF detenga el bucle. La misma regla aplica a fgets() y fread().
Ejemplo 3: Contar ocurrencias de un carácter
Dado que fgetc() te proporciona un carácter a la vez, resulta muy útil para contar en streaming sin cargar todo el archivo en memoria:
<?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()
| Función | Lee | Úsala cuando |
|---|---|---|
fgetc() | Un carácter | Necesitas control a nivel de carácter o detenerte en un byte específico |
fgets() | Una línea (hasta un salto de línea) | Procesas texto línea por línea |
fread() | Un número fijo de bytes | Lees datos binarios o grandes bloques a la vez |
Para archivos binarios, prefiere fread() — usar fgetc() en un bucle funciona pero es mucho más lento por byte.
Notas y advertencias
fgetc()funciona en flujos seguros para binarios: devuelve un byte incluso para caracteres no textuales. Los caracteres UTF-8 multibyte abarcan varios bytes, por lo que una sola llamada afgetc()puede devolver únicamente parte de dicho carácter.- Abre el archivo con el modo correcto (
'r','rb', etc.) usandofopen(), y recuerda cerrarlo confclose(). - También puedes comprobar el final del archivo explícitamente con
feof(), aunque compararfgetc()contrafalsesuele ser suficiente.
Conclusión
fgetc() lee un carácter a la vez desde un puntero de archivo abierto y devuelve false al final del archivo, lo que la hace ideal para el análisis y el conteo a nivel de carácter. Recuerda solo dos puntos esenciales: pasa un recurso abierto desde fopen(), y termina tu bucle de lectura con la verificación estricta !== false para que un 0 literal nunca te detenga antes de tiempo. Para trabajar con líneas o bloques, recurre a fgets() o fread().
Para más información sobre el manejo de archivos en PHP, consulta la guía de Manejo de archivos en PHP.