Fgetc: примеры (PHP)

Посимвольное чтение файлов при помощи fgetc
Раздел: Работа с файлами
fgetc(resource $stream): string|false
Описание функции fgetc

Функция fgetc() в PHP предназначена для посимвольного чтения данных из файла. Она возвращает строку, содержащую один прочитанный символ, либо значение false, если достигнут конец файла (EOF) или произошла ошибка.

Область применения

Эта функция применяется при необходимости последовательной обработки отдельных символов, например, при анализе специфичных форматов данных, реализации простых парсеров или лексических анализаторов, когда другие методы чтения (построчные или блочные) не подходят.

Аргументы

Функция принимает один обязательный аргумент:

  • stream (ресурс) — указатель (дескриптор) на открытый файл. Ресурс должен быть получен с помощью функции fopen() и быть доступным для чтения.
Короткие примеры использования
Базовое чтение символа
<?
$fp = fopen('test.txt', 'r');
if ($fp) {
    $char = fgetc($fp); // Чтение первого символа
    echo $char;
    fclose($fp);
}
?>
H
Чтение до конца файла
<?
$fp = fopen('test.txt', 'r');
if ($fp) {
    while (($char = fgetc($fp)) !== false) {
        echo $char;
    }
    fclose($fp);
}
?>
Hello, World!
Обработка пустого файла
<?
$fp = fopen('empty.txt', 'r');
$char = fgetc($fp);
var_dump($char);
fclose($fp);
?>
bool(false)
Похожие функции в PHP

Читает строку из файла. Используется для построчной обработки текстовых данных. Полезна при чтении файлов с четкой структурой строк.

Читает указанное количество байт из файла. Применяется для блочного чтения бинарных данных или файлов фиксированной структуры.

Считывает весь файл в строку. Оптимальна для работы с небольшими файлами, когда требуется получить все содержимое сразу для обработки в памяти.

Выбор зависит от задачи: для анализа каждого символа нужна fgetc(), для строк — fgets(), для бинарных данных — fread(), а для загрузки всего файла — file_get_contents().

Аналоги в других языках

Fgetc в Python

Метод file.read(1) объекта файла выполняет аналогичную задачу. Он читает один символ (байт) или пустую строку при EOF.

with open('test.txt', 'r') as f:
    char = f.read(1)
    print(char)
H
JavaScript (Node.js)

В Node.js чтение посимвольно обычно реализуется через потоки (Streams) или метод fs.readSync() с указанием длины 1 байт.

const fs = require('fs');
const fd = fs.openSync('test.txt', 'r');
const buffer = Buffer.alloc(1);
fs.readSync(fd, buffer, 0, 1, null);
console.log(buffer.toString());
fs.closeSync(fd);
H

Fgetc в MySQL

Прямого аналога для посимвольного чтения файлов на стороне СУБД нет. Функция LOAD_FILE() читает весь файл как строку. Для обработки отдельных символов потребуется использовать строковые функции, такие как SUBSTRING().

Типичные ошибки
Игнорирование строгой проверки на false

Использование нестрогого сравнения в условии цикла может привести к преждевременному завершению чтения, если символ (например, "0") приводится к логическому false.

<?
$fp = fopen('data.txt', 'r');
// Неправильно:
while ($char = fgetc($fp)) { // Символ '0' остановит цикл
    echo $char;
}
fclose($fp);
?>

Правильный вариант — строгое сравнение: while (($char = fgetc($fp)) !== false).

Чтение после закрытия дескриптора
<?
$fp = fopen('test.txt', 'r');
fclose($fp);
$char = fgetc($fp); // Предупреждение и false
?>
Warning: fgetc(): supplied resource is not a valid stream resource
История изменений

В PHP 8.0 и 8.1 существенных изменений в поведении функции fgetc() не было. Однако, в PHP 8.0 усилилась общая строгость типизации, что может повлиять на передачу некорректных типов аргументов. Функция продолжает стабильно работать в контексте посимвольного чтения файлов.

Расширенные примеры
Анализ частоты символов
Пример php
<?
$fp = fopen('text.txt', 'r');
$stat = [];
if ($fp) {
    while (($char = fgetc($fp)) !== false) {
        if (!isset($stat[$char])) {
            $stat[$char] = 0;
        }
        $stat[$char]++;
    }
    fclose($fp);
    print_r($stat);
}
?>
Array
(
    [H] => 1
    [e] => 1
    [l] => 3
    [o] => 2
    [,] => 1
    [ ] => 1
    [W] => 1
    [r] => 1
    [d] => 1
    [!] => 1
)
Чтение бинарного файла с обработкой заголовка
Пример php
<?
$fp = fopen('image.png', 'rb');
if ($fp) {
    $header = '';
    for ($i = 0; $i < 8; $i++) {
        $header .= bin2hex(fgetc($fp));
    }
    echo 'Сигнатура PNG: ' . $header;
    fclose($fp);
}
?>
Сигнатура PNG: 89504e470d0a1a0a
Чтение из стандартного потока ввода
Пример php
<?
$stdin = fopen('php://stdin', 'r');
echo 'Введите символ: ';
$input = fgetc($stdin);
echo 'Вы ввели: ' . $input;
fclose($stdin);
?>
Введите символ: A
Вы ввели: A
Поиск конкретного символа в потоке
Пример php
<?
$fp = fopen('log.txt', 'r');
if ($fp) {
    $position = 0;
    while (($char = fgetc($fp)) !== false) {
        $position++;
        if ($char === ';') {
            echo 'Символ ; найден на позиции: ' . $position;
            break;
        }
    }
    fclose($fp);
}
?>
Символ ; найден на позиции: 42

PHP fgetc function comments

En
Fgetc Gets character from file pointer