Datei schreiben
Samuel Vogel
- php
Hallo,
Ich würde gerne eine Datei schreiben also per fwrite() sum Beispiel.
Aber die Datei soll mehere Werte enthalten, also:
$a = "12345";
$color = "red";
Das ist ja auch nicht weiter schwer doch ich will die Werte einzeln reinschreiben un deinzeln ändern.
Man könnte ja die Datei auslesen und den zu ändernden Wert eben ändern und dann wieder in die Datei schreiben. Doch ich wollte fragen ob es eine andere Möglichkeit gibt?
Per MySQL könnte man es ja such machen doch dass wird dann für viele User zu schwer!
samy,
hi,
Man könnte ja die Datei auslesen und den zu ändernden Wert eben ändern und dann wieder in die Datei schreiben. Doch ich wollte fragen ob es eine andere Möglichkeit gibt?
m.W. hast du in einem sequentiellen dateisystem keine andere möglichkeit.
Per MySQL könnte man es ja such machen doch dass wird dann für viele User zu schwer!
die aussage verstehe ich jetzt so nicht ganz.
mit mysql hättest du es m.E. doch eher einfacher, du kannst gezielt datensätze selektieren und ändern, ohne overhead durch einlesen aller anderen daten wie bei der textdatei.
und gerade, wenn dann auch noch die selben daten für mehrere user anfallen, bietet die DB m.E. doch vorteile - oder willst du dann für jeden user eine eigene textdatei anlegen?
gruss,
wahsaga
Hello,
ich habe schon oft darüber nachgedacht, wie man für dieses echte Manquo von PHP ein Workaround bauen könnte. Leider unterstützt PHP keine Records / Structures mit festem Satzaufbau.
Aber auch PHP kann den Dateizeiger gezielt bewegen und hat eine recht gute String-Verarbeitung und da liegt die Lösung.
PHP unterstützt allerdigns auch keine binären Größen, sondern schreibt auch alle numerischen Daten in "human readable ASCII".
Du kannst nun ein Array aufbauen:
Variable => Typ Datenlänge Wert
-------- ---- ---------- ----------
zahl N 20 1234567
farbe C 20 Rot
user C 30 Thomas der Schlaue
Das macht zusammen 70 Byte Satzlänge.
Diesen String baust Du nun zusammen
$rec = str_pad($def[zahl][wert],$def[zahl][len]).
str_pad($def[farbe][wert],$def[farbe][len]).
str_pad($def[user][wert],$def[user][len]);
Dafür baut man sich naürlich eine foreach()-Schleife.
Die Werte dürfen ihre angegebene Länge nicht überschreiten!
Nun hast Du den Datensatz zusammengebaut und kannst ihn wegschreiben.
Das ergibt dann eine Datei mit fester Satzlänge und festem Satzaufbau. Die Vorteile gegenüber den Textdatensaätzen mit variabler Länge saind:
1. Direktzugriff auf jeden Datensatz möglich
2. Auch in grooooßen Textdateien Austausch einzelner Werte möglich,
ohne die ganze Datei einlesen zu müssen.
Das Auslesen eines einzelnes Wertess ist dann leider entsprechend komplizierter, da man erst die Startposition im Datensatz ausrechnen muss.
Das Herausschneiden geht mit trim(substr($rec,$start,$len)) dafür ganz leicht.
Man müsste sich eine eine kleine Klasse dafür schreiben. Werde ich mal auf meinen Hobby-Zettel nehmen. Und bei PHP müsste man endlich mal die Unterstützung für Low-Level-Dateiformate nachfordern.
Alternativ kann man das natürlich auch mit Arrays und serialize() unserialize machen.
Liebe Grüße aus http://www.braunschweig.de
Tom
hi,
Aber auch PHP kann den Dateizeiger gezielt bewegen und hat eine recht gute String-Verarbeitung und da liegt die Lösung.
lesend, ja - aber auch schreibend?
(und wenn ja, müsste sich m.E. PHP selbst darum kümmern, also komplette datei intern einlesen, inhalt an position tauschen, und kompletten dateiinhalt zurückschreiben - denn ein sequentielles dateisystem unterstützt wie gesagt m.W. schreiben an eine bestimmte position innerhalb einer datei nicht. ausserdem gäbe das echte schwulitäten, wenn der neu geschriebene inhalt länger oder kürzer wäre, als der alte ...)
gruss,
wahsaga
Hello,
Aber auch PHP kann den Dateizeiger gezielt bewegen und hat eine recht gute String-Verarbeitung und da liegt die Lösung.
lesend, ja - aber auch schreibend?
Das ist unabhängig vom gewünschten Öffnungsmodus.
Echte "Textdateien" kennt PHP (und C) ja gar nicht mehr.
PHP hat nur Random Access Files.
(und wenn ja, müsste sich m.E. PHP selbst darum kümmern, also komplette datei intern einlesen, inhalt an position tauschen, und kompletten dateiinhalt zurückschreiben - denn ein sequentielles dateisystem unterstützt wie gesagt m.W. schreiben an eine bestimmte position innerhalb einer datei nicht. ausserdem gäbe das echte schwulitäten, wenn der neu geschriebene inhalt länger oder kürzer wäre, als der alte ...)
Genau da liegt das Problem. PHP kennt keine Statischen Datenstrukturen, sowas wie "struct" oder "record". Die benötigt man aber, wenn man satzorientiert lesen und schreiben will.
mit fseek($fh) wird der Datensatzeiger positioniert und mit fread($fh, $anzahl) kann man dann genau $anzahl Bytes lesen oder mit fwrite($fh,$data,$anzahl) genau $anzahl Bytes aus dem Datenblock $data wegschreiben. Der Programmierer ist verantwortlich dafür, dass er nicht über das Satzende hinaus schreibt und dass die Daten im Satz genau dort liegen, wo er sie angeordnet hat.
Liebe Grüße aus http://www.braunschweig.de
Tom