Axel Schweits: PHP, fputs stiehlt Zeichen

Hallo,

ich habe folgendes Problem:
Ich öffne eine Datei, in der gerade Daten eingegeben wurden mit dem Parameter r+ und schaue dann nach, ob die erste Zeile einen bestimmten Wert hat, wenn nicht, schreibe ich $variable in die erste Zeile.

Also zwei Dateizugriffe:
1. Daten eintragen (ebenfalls mit PHP)
2. Erste Zeile lesen und eventuell neue erste Zeile eintragen

Noch mal etwas genauer:
Nachdem ich nachgeschaut habe, repositioniere ich den Zeiger wieder mit fseek($fp, 0, SEEK_SET); (oder rewind($fp);) und schreibe dann  $variable in die Datei.

Das Problem ist:
Es wird zwar genau das in die Datei geschrieben was ich wollte aber aus der nächsten Zeile verschwinden die ersten 2Zeichen. ($variable hat den wert "1"."\n")

Was mir aufgefallen ist. Egal ,ob ich $variable in die Datei schreibe oder nicht, die Dateigrösse ist immer gleich. PHP stiehlt mir also immer die Anzahl von Bytes, welche $variable an Speicherplatz verbraucht. (Vermute ich, da ich nicht weiss, wie gross $variable ist)

PS: Nachdem das erstemal in die Datei geschrieben wurde schliesse ich sie natürlich auch wieder.

Meine Frage: In welche Falle bin ich getappt?

Gruss, Axel

  1. Hallo,

    [... erste Zeile einer Datei ersetzen ...]

    Meine Frage: In welche Falle bin ich getappt?

    Du hast nicht bedacht, dass Dateien keine Zeilen kennen. Fuer Dateien (und eben
    dann auch Datei-Operationen) sind das nur Byte-Folgen. Und wenn du jetzt in eine
    Datei etwas hineinschreibst, dann nimmt das eingeschriebene einen bestimmten
    Platz ein. Wenn der Platz zu viel ist fuer die erste Zeile (genauer gesagt, die
    Bytes, die die erste Zeile eingenommen hat), dann wird eben ueber die danach
    folgenden Bytes drueber geschrieben. Loesung: erstelle eine temporaere Datei,
    schreibe sie komplett neu und benenne sie hinterher um.

    Gruesse,
     CK

    1. Danke,

      Du hast nicht bedacht, dass Dateien keine Zeilen kennen. [...]

      oh man, das war wohl ne FAQ. *gg* Da erkennt man den PHP-Newbie ;-P

      Dennoch, dank dir Christian