Feof: примеры (PHP)
feof(resource $stream): boolФункция feof в PHP
Функция feof проверяет, достигнут ли конец файла при чтении через указатель файлового потока. Она применяется при последовательном чтении файлов, чтобы определить момент завершения данных.
Функция принимает единственный обязательный аргумент:
- $stream (ресурс) — указатель на открытый файловый поток, полученный функцией
fopen().
Функция возвращает true, если указатель находится в конце файла или при ошибке, иначе false.
Примеры использования feof
Использование в цикле для чтения всего файла:
$handle = fopen('example.txt', 'r');
if ($handle) {
while (!feof($handle)) {
$line = fgets($handle);
echo $line;
}
fclose($handle);
}Содержимое файла будет выведено построчно.
$handle = fopen('example.txt', 'r');
if ($handle) {
while (!feof($handle)) {
$char = fgetc($handle);
echo $char;
}
fclose($handle);
}Каждый символ файла будет выведен отдельно.
$handle = fopen('empty.txt', 'r');
fread($handle, 1);
var_dump(feof($handle));bool(true)
Похожие функции в PHP
В PHP существуют альтернативные способы чтения файлов без явного использования feof().
Функция file() читает весь файл в массив строк, а file_get_contents() возвращает содержимое как строку. Они удобны для работы с небольшими файлами, так как загружают весь файл в память.
Класс SplFileObject предоставляет объектно-ориентированный интерфейс для работы с файлами. Метод eof() выполняет аналогичную feof() роль, но интеграция с итераторами делает код более читаемым.
Аналоги в других языках программирования
Feof в Python
В Python функция read() возвращает пустую строку при достижении конца файла, что можно использовать как условие остановки.
with open('example.txt', 'r') as file:
while True:
chunk = file.read(1024)
if not chunk:
break
print(chunk)Файл читается блоками по 1024 байта.
В Node.js чтение файлов асинхронное, и конец файла определяется по событию 'end' в потоке.
const fs = require('fs');
const stream = fs.createReadStream('example.txt');
stream.on('data', chunk => console.log(chunk));
stream.on('end', () => console.log('Файл прочитан.'));Данные выводятся по мере чтения, в конце - сообщение.
Feof в MySQL
В SQL нет прямой аналогии, но при обработке результатов запроса курсоры могут использовать условие завершения, например, NOT FOUND в процедурах.
Типичные ошибки
Использование feof() перед чтением может привести к лишней итерации.
$handle = fopen('example.txt', 'r');
while (!feof($handle)) {
$line = fgets($handle);
echo $line;
}
// Если файл пуст, цикл не выполнится, что корректно.
// Однако если последняя строка не заканчивается переводом, может возникнуть дублирование.Вывод зависит от структуры файла.
$handle = fopen('example.txt', 'r');
fclose($handle);
var_dump(feof($handle));Warning: feof() expects parameter 1 to be resource, bool given bool(false)
$handle = false;
var_dump(feof($handle));Warning: feof() expects parameter 1 to be resource, bool given bool(false)
Изменения в последних версиях PHP
В PHP 8 функция feof() была ужесточена по типизации. Передача аргументов некорректного типа теперь вызывает ошибку TypeError. В предыдущих версиях такое использование приводило к предупреждениям и возврату false.
// PHP 7
$result = feof(null); // Warning и возврат false
// PHP 8
$result = feof(null); // TypeErrorТеперь ошибка типа прерывает выполнение скрипта.
Расширенные примеры
Чтение файла блоками с обработкой возможных ошибок.
$handle = @fopen('image.jpg', 'rb');
if (!$handle) {
die('Не удалось открыть файл');
}
$blockSize = 4096;
while (!feof($handle)) {
$buffer = fread($handle, $blockSize);
if ($buffer === false) {
break;
}
// Обработка данных
echo 'Прочитано ' . strlen($buffer) . ' байт' . PHP_EOL;
}
fclose($handle);Выводится информация о количестве прочитанных байт в каждом блоке.
Использование feof() для одновременного чтения нескольких потоков.
$files = ['file1.txt', 'file2.txt'];
$handles = [];
foreach ($files as $file) {
$handles[] = fopen($file, 'r');
}
$allFinished = false;
while (!$allFinished) {
$allFinished = true;
foreach ($handles as $index => $handle) {
if (!feof($handle)) {
$allFinished = false;
echo fgets($handle);
}
}
}
foreach ($handles as $handle) {
fclose($handle);
}Строки из файлов выводятся поочередно, пока все файлы не будут прочитаны.
Использование feof() при чтении данных из сетевого ресурса.
$context = stream_context_create(['http' => ['timeout' => 10]]);
$handle = fopen('http://example.com/data.txt', 'r', false, $context);
if ($handle) {
$content = '';
while (!feof($handle)) {
$content .= fread($handle, 8192);
}
fclose($handle);
echo 'Получено данных: ' . strlen($content) . ' байт';
}Данные считываются с веб-ресурса и подсчитывается их размер.