Einzelnen Beitrag anzeigen

Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Exception der Klasse EFOpenError - finde den Fehler nich

  Alt 12. Jul 2009, 07:26
Wie Du die Datei nennst (incl. Dateiendung) hat auf das Speichern der Daten kein Einfluss. Windows entscheidet über die Dateiendung nur, welches Programm zum anzeigen gestartet wird.

Ich denke es wurde alles korrekt gespeichert, denn Dein gewähltes Format ist für das Lotto-Programm kein Problem und korrekt, aber ein z.B. Text-Editor kann nicht viel damit anfangen. Die Zahlen zusätzlich für einen Text-Editor lesbar zu speichern wäre durchaus möglich (Konvertierung, INI-Format), aber im Prinzip unnötig.

Um zu prüfen, ob die Zahlen korrekt gespeichert wurden, lies einfach die Zahlen wieder ein und lass Dir die Werte im eigenen Programm anzeigen. Alternativ wäre ein Hex-Editor ganz brauchbar, da Du damit binäre Werte korrekt anzeigen lassen kannst (zwei gute HexEditoren sind sogar hier im Forum zu finden).

***

Zum Inhalt der Datei:

Du hast 7 Integer-Werte (32bit) gespeichert, also 28 Byte im binären Format. Da Lottozahlen zw. 1 und 49 liegen, sind die meisten Werte nicht als sichtbares Zeichen darstellbar (Werte 0-31 sind Steuerzeichen in Texteditoren/Druckern)

Es ist also so, das der binäre Wert 1 nicht dem Zeichen für die Zahl "1" entspricht, die Zahl 1 hat den ASCII-Wert 49, Zahl 2 = 50 usw. Ein Text-Editor wird also die Werte 1-49 dem ASCII-Zeichen 1-49 zuordnen, was bis 31 meistens nur Kästchen gibt (da nicht darstellbar) und ab 32 mehr Satzzeichen, weil die in der ASCII-Tabelle in dem Bereich liegen. Du kannst ja mal via Google nach ASCII-Tabelle suchen um zu verstehen, wie das ganze zugeordnet ist.

Bei Deinem Record TZiehung wären auch noch zwei Änderungen möglich, die die Dateigröße verkleinern. Im aktuellen Beispiel nicht der Rede wert, aber bei einer Reihe von Ziehungen kann die Datei dadurch unnötig mit "Füllbytes" aufgebläht sein.

Die Zahlen 1-49 lassen sich mit einem Byte Darstellen (0-255). Du verwendest aber ein 32bit Integer (Größe 4 Byte), verschwendest also 3 Byte, die nicht genutzt werden.
Delphi-Quellcode:
TZiehung = packed record
  z1,
  z2,
  z3,
  z4,
  z5,
  z6,
  zz : Byte;
end;
Damit hat der Record statt 28 Byte nur die Größe von 7 Byte. Weil Delphi aber Records für optimalen Speicherzugriff optimiert und die Bytes auf Integer "auseinander ziehen" würde (32bit Ausrichtung), würde der Record wieder 28 Byte Größe haben. Damit das nicht passiert, kann man für Dateirecords den Record-Bezeichner zu packed record erweitern
  Mit Zitat antworten Zitat