Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Binäre Datenspeicherung (https://www.delphipraxis.net/185399-binaere-datenspeicherung.html)

Cubysoft 7. Jun 2015 01:35

Binäre Datenspeicherung
 
Hey,

ich benutze derzeit ein Textformat, um meine Programmdaten zu speichern:

Code:
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
.....
Natürlich hat das Speichern in Textform auch Nachteile. Die Daten liegen folgendermaßen vor:

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:
type
TMyRecord=record
 text: String;
 zahl: Integer;
 datum: TDate;
end;

//Das ganze dann in einer TList<TMyRecord>
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...

Luckie 7. Jun 2015 02:14

AW: Binäre Datenspeicherung
 
Google: delphi record speichern :roll:

Dann zeig uns doch mal den Code, den du nicht verstehst.

himitsu 7. Jun 2015 02:42

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:
String[123]
= ShortString

Cubysoft 7. Jun 2015 03:12

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..

Aphton 7. Jun 2015 04:35

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.

p80286 7. Jun 2015 09:11

AW: Binäre Datenspeicherung
 
Zitat:

Zitat von Cubysoft (Beitrag 1304363)
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.

Delphi-Quellcode:
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;
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.

Gruß
K-H

himitsu 7. Jun 2015 09:26

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.

dummzeuch 7. Jun 2015 11:25

AW: Binäre Datenspeicherung
 
Zitat:

Zitat von himitsu (Beitrag 1304369)
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.

Ohne Probleme? Ich erinnere mich aber noch ganz deutlich an Probleme aus der Zeit, als man die noch nicht als Text abspeichern und ggf. editieren konnte. Ich musste teilweise Formulare komplett neu erstellen, weil Delphi sie nicht mehr lesen wollte/konnte. OK, das war AFAIR Delphi 4 und aelter.

Mavarik 7. Jun 2015 11:30

AW: Binäre Datenspeicherung
 
Zitat:

Zitat von Cubysoft (Beitrag 1304363)
Einer der Gründe, warum ich die Datei binär speichern möchte, ist der Platzverbrauch.

OK... Dann schreibe doch die 123 Byte langen Strings in einen gepackten Stream... und schon sind die Leerzeichen/Nullen egal.

Mavarik

himitsu 7. Jun 2015 12:30

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 10:01 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz