ftell

(PHP 3, PHP 4, PHP 5)

ftell -- 返回文件指针读/写的位置

说明

int ftell ( resource handle )

返回由 handle 指定的文件指针的位置,也就是文件流中的偏移量。

如果出错,返回 FALSE

文件指针必须是有效的,且必须指向一个通过 fopen()popen() 成功打开的文件。 在附加模式(加参数 "a" 打开文件)中 ftell() 会返回未定义错误。

例子 1. ftell() 例子

<?php

// 打开文件并读些数据
$fp = fopen("/etc/passwd", "r");
$data = fgets($fp, 12);

// 现在指针到哪里了?
echo ftell($fp); // 11

fclose($fp);

?>

参见 fopen()popen()fseek()rewind()


add a note add a note User Contributed Notes
mbirth at webwriters dot de
22-Oct-2005 02:09
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.
mweierophinney at gmail dot com
22-Jun-2005 01:00
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.
php at michielvleugel dot com
01-Jun-2005 06:19
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";}

?>