2015-07-01 23 views
5

Vielleicht ist es mein Englisch, aber die Erklärung in der PHP Manual (zitiert unten) beantwortet meine Frage nicht ganz klar. SEEK_ENDÜber die fseek() -Methode von PHP, was genau ist der Versatz (Position)?

vor der End-of-Datei in eine Position zu verschieben, müssen Sie im Offset- und festgelegt, woher einen negativen Wert zu übergeben.

Ich habe eine Datei, und ich muss auf seine (sagen wir mal) 5. Zeile schreiben. Wie sollte ich den richtigen Offset dafür trainieren?

Ich kenne es nicht einfach (5) die Zeilennummer. also schätze ich die Gesamtlänge der vorhandenen Daten bis zum Beginn der 5. Zeile. Wenn ja, gibt es eine bestimmte Länge für jede Zeile der Datei oder (am wahrscheinlichsten) ist es variabel basierend auf dem Inhalt der Zeile? und wenn seine Variable wie soll ich es herausfinden?

Jede Beratung wird geschätzt. Hier

+2

seek() arbeitet mit einem "Byte" Offset, keine Zeilennummern. Es sei denn, Sie arbeiten mit einer bekannten festen Länge für Linien (mit der Sie ein bisschen rechnen können, um herauszufinden, was der Offset sein soll), dann müssen Sie jede Zeile auf einmal lesen, um den gewünschten Offset zu erhalten ... Computer können nicht magisch erraten, wenn Leitungslängen rein willkürlich sein könnten –

+0

Vielen Dank, @MarkBaker – Ali

Antwort

0

ist ein Beispiel, basierend auf gnarf's answer here

<?php 

$targetFile = './sample.txt'; 
$tempFile = './sample.txt.tmp'; 

$source = fopen($targetFile , 'r'); 
$target = fopen($tempFile, 'w'); 

$whichLine = 5; 
$whatToReplaceWith = 'Here is the new value for the line ' . $whichLine; 

$lineCounter = 0; 
while (!feof($source)) { 

    if (++$lineCounter == $whichLine) { 
     $lineToAddToTempFile = $whatToReplaceWith; 
    } else { 
     $lineToAddToTempFile = fgets($source); 
    } 

    fwrite($target, $lineToAddToTempFile); 
} 

unlink($targetFile); 
rename($tempFile, $targetFile); 

die sich ändern wird (ersetzen) sample.txt mit folgendem Inhalt:

line one 
line two 
line three 
line four 
line five 

zu

line one 
line two 
Here is the new value for the line 3line three 
line four 
line five