PHP fread文件指针位置

时间:2012-09-24 05:22:55

标签: php fread

我想知道 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
  2. 由于二进制文件中第一个字节的位置被认为是0,而fread函数读取的是0x594字节,那么文件指针的新位置是什么?

    0x593或0x594?

    1. 第二个fread函数将从前一个文件指针位置开始读取。那么,每次都有一个fread函数的调用,文件指针的位置会被保留吗?
    2. 这意味着,在一系列fread函数调用中,每个fread函数都会从前一个fread函数设置的文件指针的位置开始读取字节?

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

      感谢。

1 个答案:

答案 0 :(得分:2)

您可以使用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()用于检索文件指针的CURRENT位置,因此您可以使用记住您所在的位置。然后你可以使用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.