Ftell: примеры (PHP)
ftell(resource $stream): int|falseФункция 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)
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
Прямого аналога нет. Позицию можно отслеживать вручную при потоковом чтении.
// Пример с 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.0 ужесточена типизация: передача аргумента некорректного типа вызывает исключение TypeError вместо предупреждения.
try {
ftell('string');
} catch (TypeError $e) {
echo $e->getMessage();
}ftell(): Argument #1 ($stream) must be of type resource, string given
$f = fopen('text.txt', 'r');
$linePositions = [];
while (!feof($f)) {
$linePositions[] = ftell($f);
fgets($f);
}
print_r($linePositions);
fclose($f);$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);$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);$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);
}