2012-09-24 55 views
0

我想知道如何freder函數移動文件內的文件指針。PHP 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

謝謝。

回答

2

您可以使用ftell()自行調查此問題。文件指針的當前位置是文件基礎設施的固有部分,和PHP是簡單地騎在libc中/的glibc的實現的fopen/FREAD /等頂級...

然而,考慮一下:

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

文件指針現在將位置爲零,因爲沒有數據被讀取。

$data = fread($fh, 500); 

文件指針現在是在500的位置,因爲它的讀取位置0-> 499(500個字節)爲先前FREAD調用的一部分。

$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.