Eine andere Möglichkeit:
STREAMS.
Beispiele für das Arbeiten mit Streams findest du hier genug. Ich möchte nur auf den interessanten Teil eingehen. Für eine Datei brauchst du immer ein Format. Hier eine Definition für ein Level-Dateiformat von [url=
www.yogularm.de/game]Yogularm[/url]:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| #FileType 4u File Version
#META 4u Meta Size STRING Meta (Name=Value;Name=Value...)
#STONES 4u Stone Count { 4u Stone Type 4 X 4 Y 1u Status-Byte Bit0 Visible 4u Extra Count { 4u Extra ID 4u Extra Data Length Data Extra Data } } |
Die Rauten leiten Kommentare ein. Sonst steht vor dem Tab immer der Datentyp (4u = 4 Bytes unsigned = Cardinal; 4 = 4 Byte signed = Integer ...). Dahinter steht eine kurze Beschreibung. Geschweifte Klammern ({ und }) zeigen, dass dieser Bereich beliebig oft wiederholt werden kann.
Für dein Adressbuch könnte das in etwa so aussehen:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| #Einträge 4u Anzahl der Einträge { 4u Anzahl der Felder { 4u Länge des Feldnamens STRING Feldname 4u Länge des Feldinhaltes STRING Feldinhalt } } |
Dabei hast du die Möglichkeit, weitere Felder hinzuzufügen. Felder sind z.B. Name, Adresse, Telefonnummer etc. Die Inhalte werden immer als String gespeichert.
Jetzt geht's an die Speichermethode:
Pseudocode
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| Write(Adressbuch.Count); for i := 0 to Adressbuch.Count-1 do begin Write(3); for j := 0 to 2 do begin Write(4); Write('NAME'); Write(Length(Adressbuch[i].Name); Write(Adressbuch[i].Name);
Write(7); Write('PRENAME'); Write(Length(Adressbuch[i].PreName); Write(Adressbuch[i].PreName);
Write(7); Write('ADDRESS'); Write(Length(Adressbuch[i].Address); Write(Adressbuch[i].Address); end; end; |
Write solltest du durch
Stream.Write ersetzen. Wie genau du mit Streams arbeitest, liest du wie schon gesagt am besten im Forum nach. Die Lesemethode ist etwas komplizierter, sollte aber auch kein Problem darstellen.
Ihabe drei Dateiformate in der Art entwickelt, die auch sehr zuverlässig funktionieren. Ich schreibe an den Anfang immer noch eine Dateitypversion. Wenn's dann beim Lesen knallt und die Dateitypversionen nicht übereinstimmen, dann kommt eine Meldung in der steht, dass vielleicht ein Programmupdate erforderlich ist. Abwärtskompatibilität ist kein Problem (neue Programmversionen können alle älteren Dateitypversionen lesen).
Der Vorteil zu XML-Dateien ist der, dass solche Streamdateien weniger Platz benötigen. Und INI-Dateien sind in ihren Möglichkeiten sehr beschränkt. Und typisierte Dateien sind eigentlich veraltet, da keine Streams verwendet werden können. Streams haben eben den Vorteil, dass man auch mal schnell in die Zwischenablage oder in den RAM anstatt in eine Datei schreiben kann.
Wenn du Fragen zu den einzelnen Punkten hast (hast du bestimmt - das war sehr oberflächlich), dann stelle sie hier.