W3docs

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|false

La función recibe un único argumento y devuelve el carácter leído o false.

Parámetros

ParámetroRequeridoDescripción
$streamUn 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 resource sigue 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 false cuando 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ónLeeÚsala cuando
fgetc()Un carácterNecesitas 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 bytesLees 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 a fgetc() puede devolver únicamente parte de dicho carácter.
  • Abre el archivo con el modo correcto ('r', 'rb', etc.) usando fopen(), y recuerda cerrarlo con fclose().
  • También puedes comprobar el final del archivo explícitamente con feof(), aunque comparar fgetc() contra false suele 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.

Práctica

Práctica
¿Cuál es la función de fgetc() en PHP?
¿Cuál es la función de fgetc() en PHP?
Was this page helpful?