【问题标题】:PHP fread file pointer positionPHP fread文件指针位置
【发布时间】:2012-09-15 13:42:58
【问题描述】:

我想知道 fread 函数如何在文件中移动文件指针。

让我们考虑以下场景:

<?php
$file=fopen(binary.txt,rb);
fread($file,0x594);
function(fread($file,0x1a8), ....); // some function w/ first argument as fread O/P
?>

代码简要概述:

它将以只读模式打开一个二进制文件。我想知道我的理解是否正确:

  1. 第一次调用 fread 函数会将 文件指针 移动到位置 0x594

由于二进制文件中第一个字节的位置被认为是0,而fread函数读取的是0x594字节,那么文件指针的新位置会是什么?

0x593 还是 0x594?

  1. 第二个 fread 函数将从前一个文件指针位置开始读取。那么,每次调用 fread 函数时,文件指针的位置都会被保留?

这意味着,在一系列 fread 函数调用中,每个 fread 函数从前一个 fread 函数设置的文件指针位置开始读取字节?

在这种情况下,它将开始从位置 0x594 到 (0x594+0x1a8) 或 0x73c 读取字节?

谢谢。

【问题讨论】:

    标签: php fread


    【解决方案1】:

    您可以使用ftell() 自行调查。文件指针的当前位置是文件基础结构的固有部分,PHP 只是在 libc/glibc 的 fopen/fread/etc 实现之上......

    但是,考虑一下:

    $fh = fopen('somefile.txt', 'r');
    

    文件指针现在位置为零,因为没有读取任何数据。

    $data = fread($fh, 500);
    

    文件指针现在将位于位置 500,因为作为先前 fread 调用的一部分,它已读取位置 0->499(500 字节)。

    $data = fread($fh, 0); // makes no sense to read 0 bytes, but hey...
    

    仍然在位置 500

    $data = fread($fh, 1); // now at 501
    $data = fread($fh, 2); // now at 503
    

    等等……

    基本上,使用 ftell() 来检查自己。 ftell() 用于检索文件指针的当前位置,因此您可以使用记住您所在的位置。然后,您可以使用 rewind()、fseek() 等...将指针全部移动,然后直接跳回您所在的位置,而不会丢失位置:

    $old_loc = ftell($fh); // 503
    fseek($fh, 9999);
    fseek($fh, 20000); // jump around a bit
    fseek($fh, $old_loc); // back to 503, ready to resume reading where we left off.
    

    【讨论】:

      猜你喜欢
      • 2012-05-28
      • 2012-02-15
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多