ftell在php函数中的输出

显示键

这是我的代码:

<?php
    $url="http://www.sina.com.cn";
    $handle = @fopen($url, "r");
    $len=get_headers($url,true);
    print_r($len);
    echo $len['Content-Length']."\n";
    if ($handle) {
        while (($buffer = fgets($handle,1024)) !== false) {
            echo ftell($handle)."\n";
            fseek($handle,200000,SEEK_CUR);
            echo ftell($handle)."\n";
        }
        if (!feof($handle)) {
            echo "Error: unexpected fgets() fail\n";
        }
        fclose($handle);
    }
?>

结果如下:

    Array
(
    [0] => HTTP/1.1 200 OK
    [Content-Type] => text/html
    [Vary] => Accept-Encoding
    [X-Powered-By] => shci_v1.03
    [Server] => nginx
    [Date] => Thu, 24 Dec 2015 04:03:39 GMT
    [Last-Modified] => Thu, 24 Dec 2015 04:01:28 GMT
    [Expires] => Thu, 24 Dec 2015 04:04:39 GMT
    [Cache-Control] => max-age=60
    [Age] => 32
    [Content-Length] => 518264
    [X-Cache] => HIT from xidan33-99.sina.com.cn
    [Connection] => close
)
518264
16
200016
200058
400058
400065
518264

Content-Length可能与我的--518264不同,执行代码时它会动态更改,对于讨论而言,它无关紧要。为什么结果不是以下?

518264
1024
201024
202048
402048
403072

请说明文件指针对fgets和ftell和fseek函数的作用。

ᴀʀᴇǫ

根据fgets()的PHP文档

当读取了长度-1个字节,换行符(包含在返回值中)或EOF(以先到者为准)时,读取结束。

这里的length是您在调用时使用的第二个参数fgets(),即1024因此,fgets()当发生以下任何一种情况时,您对的呼叫将结束阅读:

  1. 已从同一行读取1023个字节。
  2. 它已到达当前行的末尾。
  3. 它已到达文件末尾。

因此,在您的情况下,当fgets()读取第一行时,它将在读取16个字节后到达第一行的末尾,这将成为文件指针在ftell()旁边被调用时的位置ftell() 返回文件指针在文件中的当前位置。

当您在下一行fgets()再次调用时(while循环迭代),文件中的起始位置现在为16(尤其不是1024),并且您最多可以读取(16 + 1024)1040字节(不超过2048)。同样,如果您的下一行只有42个字节,则fgets()它将以58个字节结束读取,这将是ftell()再次被调用时文件指针的位置

再次,您fgets()将从58个字节开始,读取最多(58 + 1024 =)1082个字节。它将继续这种方式。

效果fseek()
fseek()用于将文件指针移动到$ offset(第二个参数)设置的文件中的特定位置根据fseek()的PHP文档,第三个参数值可以是-

SEEK_SET-设置位置等于偏移字节。
SEEK_CUR-将位置设置为当前位置加上偏移量。
SEEK_END-将位置设置为文件末尾加上偏移量。

因此,通过fseek($handle,200000,SEEK_CUR);将文件指针设置为200000 +当前位置。例如,它将在16时移动到200016。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章