dedlfix: Lesen und Schreiben von Dateien

Beitrag lesen

echo $begrüßung;

Mit folgendem Code erreiche ich genau das, was ich will, nämlich daß eine Zahl in einer txt-Datei mit jedem Aufruf einer Testseite um 1 größer wird:

<?php
$handle=fopen("testfile.txt","r");
$inhalt=fgets($handle);
$inhaltneu=$inhalt+1;
fclose($handle);
echo"<p>In der Datei steht: ".$inhalt."</p>\n";
echo"<p>Der NEUE Inhalt wäre: ".$inhaltneu."</p>\n";
$handle=fopen("testfile.txt","w");
fputs($handle,$inhaltneu);
fclose($handle);
?>

  
Du solltest dir unbedingt den Artikel über das [Sperren von Dateien](http://aktuell.de.selfhtml.org/artikel/programmiertechnik/dateisperren/index.htm) zu Herzen nehmen. In deinem Labor bist du der einzige, der die Seite aufruft. Stellst du sie online, können weitere Zugriffe erfolgen, während du noch mitten in der Bearbeitung bist. Das muss verhindert werden, wenn du keine falschen Ergebnisse haben möchtest.  
  

> Wenn ich mir die txt-Datei nach mehreren Seitenaufrufen öffne, steht auch wirklich nur eine Zahl drin, nämlich die aktuelle. Das heißt, mit oben geschriebenen Code erreiche ich genau das, was ich will, nämlich das der alte Inhalt überschrieben wird mit dem neuen.  
  
Nein, es gibt beim Nichtbeachten der parallelen Zugriffe Ausnahmen: A liest den Wert x aus der Datei aus. Nun kommt B und liest ebenfalls den aktuellen Wert x aus. Jetzt kommt A wieder an die Reihe, erhöht auf x+1 und schreibt die Datei. Anschließend macht B das genauso. Am Ende hast du x+1 und nicht x+2 in der Datei stehen.  
  
Anderes Szenario: A ist bereits dabei, die Datei zum Schreiben zu öffnen. Dabei wird im Modus w der Inhalt gelöscht. Nun kommt B und will selbigen lesen, doch es ist nichts da, was beim folgenden Rechnen mit diesem Wert 0 entspricht. A schreibt sein x+1 hinein, nun öffnet B zum Schreiben und schreibt eine 1 hinein, denn 0+1=1.  
  

> Dann habe ich mir gedacht, ich könnte den Code schlanker machen und nur ein mal das txt-File öffnen und schließen. Im php-Buch steht bei der [fopen-Funktion](http://de.php.net/manual/de/function.fopen.php), daß sowohl w+, a+ als auch r+ zum Lesen UND Schreiben berechtigt.  
  
Ja, da steht aber auch, was die drei Modi voneinander unterscheidet.  
Wie ich ja bereits in meiner ersten Antwort ausführte, ist eine Datei eine Aneinanderreihung von Bytes. Es gibt außerdem einen Dateizeiger, der die Position angibt, an der die nächste Aktion erfolgt, sei es nun Lesen oder Schreiben. Wenn der Dateizeiger am Ende der Datei steht, kann ein Lesezugriff nichts mehr lesen. Ein Schreibzugriff hingegen hängt das zu Schreibende hinten an. Steht er am Anfang, ohne dass der Inhalt gelöscht wurde, liest ein Lesezugriff den Wert aus. Ein anschließender Schreibzugriff hängt hinten an, wenn der Zeiger nicht wieder nach vorn positioniert wurde. Wurde er das, wird der alte Wert überschrieben, was aber alten Rest übrig lässt, wenn der neue Wert kürzer war als der alte.  
  
  
echo "$verabschiedung $name";