![]() |
Binäre Datenspeicherung
Hey,
ich benutze derzeit ein Textformat, um meine Programmdaten zu speichern:
Code:
Natürlich hat das Speichern in Textform auch Nachteile. Die Daten liegen folgendermaßen vor:
1;de //<-- Header
1;Sample;2563;3453;2143;20.3.1997;12.12.2010 2;TollerName;2343;2353;2342;20.5.2010;21.5.2010 ..... Header: Record: - Version (Integer) - Sprache (String, feste Länge) Jede darauf folgende Zeile ist von einem Record Typ, dieser beinhaltet Integer, Strings (einen mit variabler, Rest mit fester Länge) und TDate. Diese Records sind alle in einer TList<TMyRecord>. Ich kenne mich mit dem Speichern und Auslesen von binären Daten leider garnicht aus. Ich habe damals mal eine Liste mit Records (ohne Strings) ganz einfach binär abspeichern können, da ich allerdings diesmal einen String mit variabler Länge enthalten habe, komme ich nicht weiter. Ich weiß, dass es geht, nur nicht wie. Ich wäre euch wirklich dankbar, wenn ihr mir einen kleinen Beispielcode geben könntet für das schreiben und lesen binärer Informationen. Ihr könnt euch hierbei gerne an ein kompakteres Record wenden:
Delphi-Quellcode:
Ich will hier nur nocheinmal klar machen, dass ich NICHT das Programm von euch geschrieben haben möchte (das kann man denke ich an meinen früheren Posts erkennen). Ich suche nur schon seit Stunden im Internet nach Lösungen und stolpere immer wieder über Codes, die ich nicht verstehe. Theoretisch müsste das ja mit einem MemoryStream gehn. Ich weiß leider nur überhauptnicht wie...
type
TMyRecord=record text: String; zahl: Integer; datum: TDate; end; //Das ganze dann in einer TList<TMyRecord> |
AW: Binäre Datenspeicherung
Google: delphi record speichern :roll:
Dann zeig uns doch mal den Code, den du nicht verstehst. |
AW: Binäre Datenspeicherung
Und um es kurz zu machen, einen Record mit einem LongString (String, AnsiString, UnicodeString), WideString oder einem dyn. Array speichert man niemals "direkt" binär, aber das sollte auch in jedem ordentlichen Tutorial erwähnt werden.
der Typ
Delphi-Quellcode:
= ShortString
String[123]
|
AW: Binäre Datenspeicherung
Hey,
danke für eure Antworten. Das was ihr vorgeschlagen habt, kenne ich schon bereits und kann es so auch umsetzen, allerdings gibt es hierbei ein Problem: Ich will nicht immer ein 123 Zeichen großes Char-Array schreiben, weil der String manchmal (meitens) deutlich kleiner ist. Einer der Gründe, warum ich die Datei binär speichern möchte, ist der Platzverbrauch. Die Variante, die Tipps, die ich dazu bis jetzt gehört habe, haben vorgeschlagen, dass man einfach die Größe des Strings vor dem Datum (variabler String) schreibt. Trotzdem kann ich das wie gesagt nicht umsetzen.. und Code kann ich euch logischerweise nicht zeigen, da ich noch keinen habe, der mein Problem löst. Ich habe derzeit einfach ein kleines "Test-Projekt" offen, und dort habe ich festgestellt, dass das eben bei variablen Strings nicht so einfach ist.. |
AW: Binäre Datenspeicherung
Naja so schwer ists auch wider nicht. Für dynamische Daten musst du extra Information speichern: Länge/Größe - damit weißt du dann beim Auslesen, wie viel/lang zu lesen ist.. Und String (AnsiString) ist ein dynamischer Typ- die Länge ist nicht konstant.
Dh aus String wird: <Länge des Strings> <String> Aus bel. dyn. Array wird: <Länge des Arrays><Array> Wobei das Speichern der Elemente des Arrays wieder rekursiv gleich behandelt werden muss - dh, wenn es z.B. ein String ist (also Array of String), muss für jedes Element die Länge mitgespeicher werden.. würde beispielsweise für dieses Array[2] {"Hallo", "Welt"} so aussehen: <Länge: "2"> <Länge: "5"> <"Hallo"> <Länge: "4"> <"Welt"> Wie viel Speicher du für die Längenangabe belegen willst, musst du für dich selbst entscheiden (1 [Byte], 2 [Word], 4 [DWord] oder 8 Bytes [LongLong/Double?]). Ein Tipp: Wenn die Länge der Variable < 2^(x*8) ist, dann wähle x als Datentyp. |
AW: Binäre Datenspeicherung
Zitat:
Delphi-Quellcode:
Ich hab z.Zt. kein Delphi verfügbar, darum müßtest Du die Details noch überprüfen, aber das Prinzip sollte klar sein. Das Auslesen funktioniert entsprechend, erst die Länge lesen, dann die eigentlichen Daten.
type
f=tstream; s=ansistring; begin f:=tstream.create(myfile); f.write(length(s),sizeof(length(s)); f.write(s[1],sizeof(ansichar)*length(s)); f.free; end; Gruß K-H |
AW: Binäre Datenspeicherung
Wenn binär, dann verwende einfach TReader/TWriter.
Hat auch den Vorteil, daß der Aufbau der Datei in der Datei selber gleich mit enthalten ist und vorallem sind da schon viele typsichere Methoden zum Speichern und Lesen enthalten. PS: Die DFMs im Binärformat (so wie früher in der *.DFM und heute immernoch in der Ressource gespeichert) benutzt das seit sehr, sehr, sehr vielen Jahren, ohne Probleme. |
AW: Binäre Datenspeicherung
Zitat:
|
AW: Binäre Datenspeicherung
Zitat:
Mavarik |
AW: Binäre Datenspeicherung
Die Binärvariante sollte mit #0 klarkommen, da dort die Strings ausschließlich über das Längenbyte/Längenword verwaltet werden,
aber sobald hier noch eine Umwandlung von/zur Textdarstellung vorkomt, dann war's das damit. Aber "binär"-Daten in Strings sind eh ein bissl fahrlässig. Da die DFMs im Delphi ausschließlich binär verarbeitet werden und somit die Textversion beim Einlesen erstmal umgewandelt wird, gibt es faktisch mehr Probleme mit Text, als mit binär. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz