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

Руководство по применению функции ftell в PHP
Раздел: Работа с файлами
ftell(resource $stream): int|false
Основы функции ftell

Функция ftell определяет текущую позицию указателя в файловом потоке. Она возвращает смещение в байтах от начала файла, где будет производиться следующая операция чтения или записи.

Использование функции актуально при обработке больших файлов, необходимости сохранения позиции для последующего возврата, а также для контроля прогресса операций.

Аргументы функции

$handle (ресурс) – обязательный аргумент, представляющий корректный файловый указатель, полученный функцией fopen() или подобной. Указатель должен быть открыт и доступен для чтения или записи.

Возвращаемое значение – целое число (позиция) или false при возникновении ошибки.

Базовые примеры
Определение позиции после чтения
$f = fopen('file.txt', 'r');
fread($f, 5);
echo ftell($f);
fclose($f);
5
Позиция при открытии в режиме добавления
$f = fopen('log.txt', 'a');
echo ftell($f);
fclose($f);
1024 (пример: размер файла)
Обработка ошибки
$result = ftell(false);
var_dump($result);
bool(false)
Похожие функции в PHP

fseek() – перемещает указатель на заданное смещение. Используется совместно с ftell для навигации.

rewind() – сбрасывает позицию в начало файла. Удобнее, чем комбинация fseek и ftell.

feof() – проверяет, достигнут ли конец файла. Может дополнять ftell при чтении.

Выбор зависит от задачи: ftell – для получения позиции, fseek – для перемещения, rewind – для быстрого возврата.

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

Ftell в Python

Метод tell() файлового объекта. Синтаксис похож на PHP.

with open('file.txt', 'r') as f:
    f.read(3)
    print(f.tell())
3
JavaScript (Node.js)

Прямого аналога нет. Позицию можно отслеживать вручную при потоковом чтении.

// Пример с fs.createReadStream
const fs = require('fs');
let pos = 0;
const stream = fs.createReadStream('file.txt');
stream.on('data', (chunk) => {
    pos += chunk.length;
});

Ftell в C

Функция ftell() из стандартной библиотеки. Принцип работы идентичен.

FILE *file = fopen("file.txt", "r");
fgetc(file);
long position = ftell(file);
printf("%ld", position);
1
Распространённые ошибки
Некорректный указатель файла
$f = fopen('missing.txt', 'r');
if (!$f) {
    echo 'Ошибка открытия';
} else {
    echo ftell($f);
}
Ошибка открытия
Закрытый ресурс
$f = fopen('test.txt', 'r');
fclose($f);
$pos = ftell($f);
var_dump($pos);
bool(false) с предупреждением
Использование с каталогом
$dir = opendir('.');
echo ftell($dir);
bool(false) – функция не работает с каталогами
Изменения в PHP 8

В PHP 8.0 ужесточена типизация: передача аргумента некорректного типа вызывает исключение TypeError вместо предупреждения.

try {
    ftell('string');
} catch (TypeError $e) {
    echo $e->getMessage();
}
ftell(): Argument #1 ($stream) must be of type resource, string given
Расширенные примеры
Сохранение позиций строк в файле
Пример php
$f = fopen('text.txt', 'r');
$linePositions = [];
while (!feof($f)) {
    $linePositions[] = ftell($f);
    fgets($f);
}
print_r($linePositions);
fclose($f);
Обработка бинарного файла с заголовком
Пример php
$f = fopen('image.png', 'rb');
$header = fread($f, 8);
$afterHeader = ftell($f);
echo 'Позиция после заголовка: ' . $afterHeader;
// Определение размера файла
fseek($f, 0, SEEK_END);
$fileSize = ftell($f);
echo 'Размер файла: ' . $fileSize;
fclose($f);
Мониторинг прогресса чтения
Пример php
$f = fopen('large.bin', 'r');
fseek($f, 0, SEEK_END);
$total = ftell($f);
rewind($f);
while (!feof($f)) {
    $current = ftell($f);
    $percent = round(($current/$total)*100, 2);
    echo "Обработано: {$percent}%\n";
    fread($f, 4096);
}
fclose($f);
Работа с сетевым потоком
Пример php
$context = stream_context_create(['http' => ['timeout' => 5]]);
$stream = fopen('http://example.com/data', 'r', false, $context);
if ($stream) {
    fread($stream, 100);
    echo 'Текущая позиция: ' . ftell($stream);
    fclose($stream);
}

PHP ftell function comments

En
Ftell Returns the current position of the file read/write pointer