Wie kann ich feststellen, was eine Dateiressource Zeile ist zur Zeit „on“ in PHP?

StackOverflow https://stackoverflow.com/questions/1352598

  •  20-09-2019
  •  | 
  •  

Frage

Mit PHP ist es möglich, den Inhalt einer Datei mit fopen und fgets abzulesen. Jedes Mal, fgets heißt, es gibt die nächste Zeile in der Datei.

Wie fgets weiß welche Zeile zu lesen? Mit anderen Worten, wie weiß es, dass es zuletzt gelesene Zeile 5, so sollte es den Inhalt der Zeile 6 dieses Mal zurückkehren? Gibt es eine Möglichkeit für mich, um Zugang dass Zeilennummer Daten?

(Ich weiß, es möglich ist, etwas ähnliches zu tun, indem Sie den gesamten Inhalt der Datei in ein Array mit file zu lesen, aber ich möchte dies mit fopen erreichen.)

War es hilfreich?

Lösung

Es gibt eine „Position“ im Speicher gehalten für jede Datei, die geöffnet wird; es wird automatisch jedes Mal, wenn Sie lesen gerade eine Zeile / Zeichen / was auch immer aus der Datei aktualisiert.

Sie können diese Position erhalten mit ftell , und ändern Sie es mit < a href = "http://php.net/manual/en/function.fseek.php" rel = "nofollow noreferrer"> fseek :

  

ftell - Liefert die aktuelle Position   die Datei Lese- / Schreibzeiger

     

fseek - Positioniert auf einem Dateizeiger

Sie können auch verwenden rewind ... rewind ... die Position des Zeigers.


Dies ist nicht eine Position als Zeilennummer bekommen, aber näher an eine Stelle als Zeichenzahl (eigentlich sind Sie die Position als eine Anzahl von Bytes vom Anfang der Datei immer) ; wenn Sie das haben, eine Zeile zu lesen ist nur ein metter lesen Zeichen bis yu ein Ende der Zeile Zeichen getroffen.


BTW: soweit ich mich erinnere, kommt diese Funktionen aus der Programmiersprache C - PHP selbst in C geschrieben ist; -)

Andere Tipps

Die Dateien sind nur ein Strom von Daten, von Anfang bis zum Ende gelesen. Das Betriebssystem wird sich erinnern, die Position, die Sie in dieser Datei bisher gelesen habe. Bei Bedarf ist dabei in der Anwendung als auch ziemlich einfach. Das Betriebssystem kümmert sich nur um Byte-Positionen aber nicht Linien.

Man stelle sich vor der Reihe nach ein Deck aus 52 Karten austeilt. Hand von Ihnen die erste Karte. Das nächste Mal die 2. Karte. Wenn Sie die 3. Karte geben wollen, müssen Sie nicht wieder das Zählen von Anfang an starten, oder auch dann, wenn Sie die Erinnerung waren Sie die nächste verfügbare Karte auszuteilen nur, und das wird die dritte sein.

Es könnte ein bisschen mehr Arbeit, die Zeilen zu lesen benötigt wird, da man sich wünschen kann, um Daten aus der Datei für preformance Sake Lesepuffer, aber es ist nicht, dass es viel mehr als das Offset des letzten Stückes aufzeichnen von Daten, die Sie übergeben, um die nächsten newline-Zeichen und die Hand von allen Daten zwischen diesen zwei Punkten finden.

PHP noch das OS hat keine wirkliche Notwendigkeit, um die Zeilennummer zu halten, da alle Systempflege über „nächste Zeile“ ist. Wenn Sie die Zeilennummer wissen wollen, halten Sie einen Zähler und erhöhen es jedes Mal Ihre Anwendung eine Zeile liest.

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

}

i hav diese alte Probe i seine Dose Hilfe Kochfeld Sie:)

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

$linenr = 5;

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

echo $array[($linenr-1)];

Sie könnten nur fgets anrufen und eine var $line_number jedes Mal, wenn Sie es nennen erhöhen. Das würde Ihnen sagen, die Linie ist es auf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top