0

PHPを使用すると、とを使用してファイルの内容を読み取ることができfopenますfgets。が呼び出されるたびfgetsに、ファイル内の次の行が返されます。

どの行を読むべきかをどうやってfgets 知るのですか?つまり、最後に5行目を読み取ったことをどのようにして知るので、今回は6行目の内容を返す必要がありますか?その行番号データにアクセスする方法はありますか?

(ファイルの内容全体をで配列に読み込むことで同様のことが可能であることはわかっていますが、fileこれを実現したいと思いfopenます。)

4

4 に答える 4

7

開かれるファイルごとにメモリに保持される「位置」があります。ファイルから行/文字/その他を読み取るたびに自動的に更新されます。

この位置は、で取得し、 :ftellで変更できます。fseek

ftell —ファイルの読み取り/書き込みポインタの現在の位置を返します

fseek —ファイルポインタをシークします

巻き戻しを使用して...巻き戻し...そのポインタの位置を使用することもできます。


これは、行番号としての位置を取得するのではなく、文字番号としての位置を取得します(実際には、ファイルの先頭からのバイト数として位置を取得します)。あなたがそれを持っているとき、行を読むことは、yuが行末文字に達するまで文字を読むことの単なるメッターです。


ところで:私が覚えている限り、これらの関数はC言語から来ています-PHP自体はCで書かれています;-)

于 2009-08-29T23:05:06.937 に答える
3

ファイルは単なるデータのストリームであり、最初から最後まで読み取られます。OSは、そのファイルでこれまでに読んだ位置を記憶します。必要に応じて、アプリケーションでもこれを行うのは非常に簡単です。ただし、OSは行ではなく、バイト位置のみを考慮します。

52枚のカードのデッキを順番に配ることを想像してみてください。最初のカードを渡します。次回は2.カード。3.カードを配りたいときは、最初から数え始める必要はありません。また、次の利用可能なカードを配るだけで、どこにいたかを覚えておく必要もありません。これが3番目になります。

パフォーマンスのために実際のファイルから読み取ったデータをバッファリングする必要があるため、行を読み取るために必要な作業は少し多いかもしれませんが、最後のデータのオフセットを記録することほど多くはありません。配られた後、次の改行文字を見つけて、それらの2つのポイント間のすべてのデータを渡してください。

システムが気にするのは「次の行」だけなので、PHPもOSも行​​番号を保持する必要はありません。行番号を知りたい場合は、カウンターを保持し、アプリが行を読み取るたびにカウンターをインクリメントします。

$lineno=0;
while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    lineno++; // keep track of the line number
     ...

}
于 2009-08-29T23:10:33.570 に答える
0

呼び出すたびfgetsにvarを呼び出してインクリメントすることができます。$line_numberそれはあなたにそれが上にある線を教えてくれるでしょう。

于 2009-08-30T01:06:32.527 に答える
0

私はこの古いサンプルを持っています私はそれがあなたを助けることができると思います:)

$File = file('path');
$array = array();

$linenr = 5;

foreach( $File AS $line_num => $line )
{
$array = array_push( $array , $line );
}

echo $array[($linenr-1)];
于 2009-08-30T01:21:09.837 に答える