Christoph: In Datei schreiben

Hi
Ich habe eine Datei geöffnet: $datei = fopen("datei.txt", "r+");
Dann hab ich die erste Zeile ausgelesen: $zeile = fgets($datei, 1000);
Warum klappt es nun nicht, über fwrite($datei, "hallo"); den Wert hallo in die zweite Zeile zu schreiben. Es ändert sich nämlich gar nichts.

Christoph

Danke für die Hilfe

  1. Danke für die Hilfe

    Hoffe, ich kann Dir so helfen. Es gibt für PHP ein sehr gutes FAQ unter http://www.dclp-faq.de. Dort habe ich folgendes zum Thema gefunden:

    Antwort von Kristian Köhntopp
    Für dieses Problem gibt es keine elegante oder effiziente Lösung. Die Ursache liegt darin, wie Unix und Windows die unterliegenden Dateien handhaben, nämlich als unstrukturierte Byteströme. Für diese Byteströme gibt es keine Indices und auch keine Methoden, mit denen man effizient beliebige Teile der Datei löschen oder in die Datei einfügen könnte.

    Tatsächlich ist der Wunsch nach einfachen Einfüge- und Löschoperationen der Auslöser für die Schaffung von Datenbankfunktionen wie die DBM-Funktionen oder von ganzen Datenbanken wie MySQL gewesen. Wenn man auf diese Sorte Problem trifft, sollte man also intensiv über den Einsatz von DBM-Dateien oder Datenbanken nachdenken.

    Um in einer Datei eine Zeile einzufügen oder zu löschen, muß man die Datei öffnen und zeilenweise durchlesen und in eine zweite Datei schreiben. Erreicht man die gewünschte Position, muß man dort eine Zeile einfügen oder löschen. Nach Abschluß der Operation ist die Originaldatei zu löschen und die neue Datei umzubenennen. Dabei ist zu beachten, daß in einer Webumgebung ohne weiteres mehrere Benutzer zugleich eine solche Operation für dieselbe Datei anfordern können. Man muß also auch durch Locking dafür Sorge tragen, daß sich diese Benutzer nicht in die Quere kommen.

    Shared lock auf die Quelldatei

    $old = fopen($oldfile, "r");
    flock($old, 1) or die("Kann die Quelldatei $oldfile nicht locken.");

    Exclusive lock auf die Zieldatei

    $new = fopen($oldfile.".new", "w");
    flock($new, 2) or die("Kann die Zieldatei $newfile nicht locken.");

    $lineno = 0;

    while($line = fgets($old, 1024)):
      if ($lineno++ == $zielzeile)
        continue;  # Zeile auslassen

    fputs($new, $line);
    endwhile;

    fclose($old); # Gibt das Lock automatisch auf

    Alte Datei wegwerfen.

    unlink($oldfile);

    Neue Datei umbenennen.

    (In Windows müssen das rename() und das fclose($new)

    #  vertauscht werden, da es nicht möglich ist, in Windows
    #  eine offene Datei umzubenennen.
    rename($oldfile.".new", $oldfile);

    Neue Datei schließen und dabei Lock aufgeben.

    fclose($new);

    Gruß,
    Nils

  2. Halihallo Christoph

    Ich habe eine Datei geöffnet: $datei = fopen("datei.txt", "r+");
    Dann hab ich die erste Zeile ausgelesen: $zeile = fgets($datei, 1000);
    Warum klappt es nun nicht, über fwrite($datei, "hallo"); den Wert hallo in die zweite Zeile zu schreiben. Es ändert sich nämlich gar nichts.

    Öm. Wahrscheinlich, weil r+ für _Read_ steht und nicht für Write. Versuchs mal mit

    fopen("datei.txt", "w+");

    Viele Grüsse

    Philipp

    1. Halli Christoph,
      Hallo Philipp,

      Öm. Wahrscheinlich, weil r+ für _Read_ steht und nicht für Write. Versuchs mal mit

      fopen("datei.txt", "w+");

      Aua!
      Dann sind die Daten weg.

      r+ öffnet eine Datei zum Lesen und Schreiben, sezt den Dateizeiger auf den Anfang der Datei (vor das erste Byte).

      w+ legt eine Datei zum Schreiben und Lesen an. Wenn sie schon vorhanden ist, wird ihr Inhalt gelöscht. Der Dateizeiger steht daher gleichermaßen am Ende und am Anfang der Datei. Das haben leere Dateien so an sich.

      a+ öffnet eine Datei zum Anfügen. Wenn sie nicht vorhanden ist, wird sie angelegt. Vorhandene Daten bleiben erhalten. Der Dateizeiger steht hinter dem Ende der Datei, also auf dem ersten neuen Byte.

      Viele Grüsse

      Tom

      1. Halihallo Tom

        [...]

        http://www.php.net/manual/de/function.fopen.php

        hätte ich eigentlich beim ersten Posting schon setzen können... Aber danke, wusste nicht, dass man bei r+ auch schreiben und umgekehrt kann... Aber man wird bekanntlich auch schlauer, wenn man Linksetzer spielt...

        Viele Grüsse

        Philipp

  3. Hallo!

    Ich habe eine Datei geöffnet: $datei = fopen("datei.txt", "r+");

    versuche es mit:                                             "a"

    rest hier :http://www.dclp-faq.de

    Gruss Sven