1

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. 2 番目の fread 関数は、前のファイル ポインター位置から読み取りを開始します。では、fread 関数の呼び出しがあるたびに、ファイル ポインタの位置は保持されるのでしょうか。

つまり、一連の fread 関数呼び出しで、各 fread 関数は、前の fread 関数によって設定されたファイル ポインターの位置からバイトの読み取りを開始します。

この場合、位置 0x594 から (0x594+0x1a8) または 0x73c までのバイトの読み取りを開始します

ありがとう。

4

1 に答える 1

4

ftell()を使用して、これを自分で調べることができます。ファイル ポインターの現在の位置はファイル インフラストラクチャの固有の部分であり、PHP は libc/glibc の fopen/fread/etc の実装の上に乗っているだけです。

ただし、次の点を考慮してください。

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

データが読み取られていないため、ファイル ポインタは位置ゼロになります。

$data = fread($fh, 500);

ファイル ポインタは、以前の fread 呼び出しの一部として位置 0->499 (500 バイト) を読み取ったため、位置 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 LOCATION を取得するために使用されるため、現在地を記憶することができます。その後、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-09-24T05:45:20.557 に答える