ftell

(PHP 4, PHP 5, PHP 7)

ftellСообщает текущую позицию чтения/записи файла

Описание

int ftell ( resource $handle )

Возвращает позицию файлового указателя handle.

Список параметров

handle

Файловый указатель должен быть действующим указателем на поток, открытый функциями fopen() или popen(). ftell() возвращает неопределённые результаты для потоков, разрешающих только запись в конец (открытых с флагом "a").

Возвращаемые значения

Возвращает позицию файлового указателя handle в виде целого числа, т.е. его смещение в файловом потоке.

При возникновении ошибки возвращает FALSE.

Замечание: Так как тип integer в PHP является целым числом со знаком и многие платформы используют 32-х битные целые числа, то некоторые функции файловых систем могут возвращать неожиданные результаты для файлов размером больше 2ГБ.

Примеры

Пример #1 Пример использования функции ftell()

<?php

// открываем файл и читаем немного данных
$fp fopen("/etc/passwd""r");
$data fgets($fp12);

// где же мы ?
echo ftell($fp); // 11

fclose($fp);

?>

Смотрите также

  • fopen() - Открывает файл или URL
  • popen() - Открывает файловый указатель процесса
  • fseek() - Устанавливает смещение в файловом указателе
  • rewind() - Сбрасывает курсор у файлового указателя

Коментарии

When trying to determine whether or not something was piped into a command line script, it is not smart to do a fgets(STDIN), because it will wait indefenitely if nothing is piped. Instead, I found ftell on STDIN to be very handy: it will return an integer of zero when something was piped, and nothing if nothing was piped to the script.

#!/usr/bin/php4 -q
<?
#following will hang if nothing is piped:
#$sometext = fgets(STDIN, 256)

$tell ftell(STDIN);

if (
is_integer($tell)==true
  {echo 
"Something was piped: ".fread(STDIN,256)."\n";}
else 
  {echo 
"Nothing was piped\n";}

?>
2005-06-01 06:19:38
http://php5.kiev.ua/manual/ru/function.ftell.html
Actually, ftell() gives more than an undefined result for append only streams; it gives the offset from the end of the file as defined before any data was appended. So if you open a file that had 3017 characters, and append 41 characters, and then execute ftell(), the value returned will be 41.
2005-06-21 13:00:04
http://php5.kiev.ua/manual/ru/function.ftell.html
Attention! If you open a file with the "text"-modifier (e.g. 'rt') and the file contains \r\n as line-endings, ftell() returns the position as if there were only \n as line-endings.

Example:
If the first line only contains 1 char followed by \r\n, the start of the second line should be position 3. (1char + \r + \n = 3 bytes) But ftell() will return 2 - ignoring one byte. If you call ftell() in line 3, the value will differ from the real value by 2 bytes. The error gets greater with every line.

(Watched this behavior in PHP 5.0.4 for Windows.)

BUT: fseek() works as expected - using the true byte values.
2005-10-21 14:09:41
http://php5.kiev.ua/manual/ru/function.ftell.html
In response to php at michielvleugel dot com:

This does not seem to be the case with PHP 5.2.0 and FreeBSD 5.4.

#!/usr/local/bin/php
<?php
$tell 
ftell(STDIN);
var_dump($tell);
?>

root@localhost:/home/david# echo Hello World | ./test.php
int(0)
root@localhost:/home/david# ./test.php
int(6629927)

When something is piped to the script, it returns an integer value of 0, however, it also returns an integer when nothing is piped to the script.

The code should  be modified to this:

#!/usr/local/bin/php
<?php
$tell 
ftell(STDIN);

if (
$tell === 0)
    echo 
"Something was piped: " fread(STDIN,256) . "\n";
else
    echo 
"Nothing was piped\n";
?>

And the result is:

root@localhost:/home/david# echo Hello World | ./test.php
Something was piped: Hello World
root@localhost:/home/david# ./test.php
Nothing was piped
2007-02-27 17:02:21
http://php5.kiev.ua/manual/ru/function.ftell.html
When opening a file to append via fopen('file','ab') the file pointer should be at the end of the file. However ftell() returns int(0) even if the file is not empty and even after writing some text into the file.
2009-09-07 16:38:01
http://php5.kiev.ua/manual/ru/function.ftell.html
Автор:
When opening a file for reading and writing via fopen('file','a+') the file pointer should be at the end of the file. However ftell() returns int(0) even if the file is not empty. Also it seems that there is two pointers, first for reading and second for writing, because it acts differently on first operation (reading or writing).

Example:
<?php
$file 
fopen('counter.txt''w');
fwrite($file'123456789');
fclose($file);

$file fopen('counter.txt''r');
echo 
ftell($file) . ' "' fgets($file) . '" ' ftell($file) . PHP_EOL;
fclose($file);

$file fopen('counter.txt''a+');
echo 
ftell($file) . ' "' fgets($file) . '" ' ftell($file) . PHP_EOL;
fclose($file);

$file fopen('counter.txt''r+');
fwrite($file'rr');
echo 
ftell($file) . ' "' fgets($file) . '" ' ftell($file) . PHP_EOL;
fclose($file);

$file fopen('counter.txt''a+');
fwrite($file'aa');
echo 
ftell($file) . ' "' fgets($file) . '" ' ftell($file) . PHP_EOL;
fclose($file);

$file fopen('counter.txt''r');
echo 
ftell($file) . ' "' fgets($file) . '" ' ftell($file) . PHP_EOL;
fclose($file);
?>

Result:
0 "123456789" 9
0 "123456789" 9
2 "3456789" 9
2 "" 2
0 "rr3456789aa" 11
2015-03-15 23:37:59
http://php5.kiev.ua/manual/ru/function.ftell.html
Автор:
Had to use 

<?php
posix_isatty
(STDIN) == false
?>

instead of 

<?php
ftell
(STDIN) !== false
?>

after upgrade from php 7 to 8 on ubuntu.
2022-10-20 12:44:56
http://php5.kiev.ua/manual/ru/function.ftell.html
Автор:
Had to use 

<?php
posix_isatty
(STDIN) == false
?>

instead of 

<?php
ftell
(STDIN) !== false
?>

after upgrade from php 7 to 8 on ubuntu.
2022-10-20 12:45:01
http://php5.kiev.ua/manual/ru/function.ftell.html

    Поддержать сайт на родительском проекте КГБ