PHP 5.4.33 Released

ftell

(PHP 4, PHP 5)

ftellDevuelve la posición de lectura/escritura actual del puntero a un fichero

Descripción

int ftell ( resource $handle )

Devuelve la posición del puntero al fichero referido por handle.

Parámetros

handle

El puntero al fichero debe ser válido, y debe apuntar a un fichero abierto con éxito por fopen() o popen(). ftell() da resultados indefinidos para flujos de sólo agregado (abiertos con la bandera "a").

Valores devueltos

Devuelve la posición del puntero al fichero referido por handle como un entero; esto es, su índice dentro del flujo de fichero.

Si se produjo un error, devuelve FALSE.

Nota: Debido a que el tipo integer de PHP es con signo y muchas plataformas usan enteros de 32 bits, algunas funciones de sistema de ficheros pueden devolver resultados inesperados para ficheros que son mayores de 2 GB.

Ejemplos

Ejemplo #1 Ejemplo de ftell()

<?php

// abre un fichero y leer algunos datos
$fp fopen("/etc/passwd""r");
$información fgets($fp12);

// ¿dónde estamos?
echo ftell($fp); // 11

fclose($fp);

?>

Ver también

  • fopen() - Abre un fichero o una URL
  • popen() - Abre un proceso de un puntero a un fichero
  • fseek() - Busca sobre un puntero a un fichero
  • rewind() - Rebobina la posción de un puntero a un archivo

add a note add a note

User Contributed Notes 5 notes

up
1
mbirth at webwriters dot de
8 years ago
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.
up
1
burninleo at gmx dot net
5 years ago
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.
up
0
missilesilo at gmail dot com
7 years ago
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
up
0
mweierophinney at gmail dot com
9 years ago
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.
up
0
php at michielvleugel dot com
9 years ago
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";}

?>
To Top