In Datei schreiben
Christoph
- php
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
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.
$old = fopen($oldfile, "r");
flock($old, 1) or die("Kann die Quelldatei $oldfile nicht locken.");
$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
unlink($oldfile);
# vertauscht werden, da es nicht möglich ist, in Windows
# eine offene Datei umzubenennen.
rename($oldfile.".new", $oldfile);
fclose($new);
Gruß,
Nils
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
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
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
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