Fgetc: примеры (PHP)
fgetc(resource $stream): string|falseФункция 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)
Читает строку из файла. Используется для построчной обработки текстовых данных. Полезна при чтении файлов с четкой структурой строк.
Читает указанное количество байт из файла. Применяется для блочного чтения бинарных данных или файлов фиксированной структуры.
Считывает весь файл в строку. Оптимальна для работы с небольшими файлами, когда требуется получить все содержимое сразу для обработки в памяти.
Выбор зависит от задачи: для анализа каждого символа нужна 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
В 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().
Использование нестрогого сравнения в условии цикла может привести к преждевременному завершению чтения, если символ (например, "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 усилилась общая строгость типизации, что может повлиять на передачу некорректных типов аргументов. Функция продолжает стабильно работать в контексте посимвольного чтения файлов.
<?
$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
)<?
$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
<?
$stdin = fopen('php://stdin', 'r');
echo 'Введите символ: ';
$input = fgetc($stdin);
echo 'Вы ввели: ' . $input;
fclose($stdin);
?>Введите символ: A Вы ввели: A
<?
$fp = fopen('log.txt', 'r');
if ($fp) {
$position = 0;
while (($char = fgetc($fp)) !== false) {
$position++;
if ($char === ';') {
echo 'Символ ; найден на позиции: ' . $position;
break;
}
}
fclose($fp);
}
?>Символ ; найден на позиции: 42