Smallint und Byte in einer Datei speichern???
Gudn Abend, ich würde gerne ein paar hundert kb Byte-Variablen und 2 Smallints speichern. Dabei geht's mir vor allem um die resultierende Dateigröße, da die Dateien auch an Modem-User übermittelt werden sollen und das eben so schnell wie möglich. Leider passen die Smallints nicht in eine ByteVariable und die Größe einer Ini hab ich auch schon überschritten. TBigIni hab ich auch schon über die Suche gefunden, nur will(darf) ich für das Programm keine Fremdkomponenten benutzen. :(
Hat da jemand eine Idee, wie ich das am Besten (Kleinsten) verpacken kann? :gruebel: THXbyTOX |
Re: Smallint und Byte in einer Datei speichern???
Das kleinste ist eine typisierte Datei, in der du die ganzen Zahlenwerte binär reinschreibst. Noch kleiner wird das, wenn dus vor der Übertragung komprimierst.
|
Re: Smallint und Byte in einer Datei speichern???
Ähm, kleine Frage: Wie mach ich das??? Das Problem ist eben, dass auch andere ohne großen Aufwand die Daten benutzen können.
Eine typisierte Datei kenn ich bis jetzt nur als 'file of Byte' o.Ä. Wie muss ich da was typisieren um das so zu machen, wie du's beschrieben hast? :gruebel: Danke schonmal |
Re: Smallint und Byte in einer Datei speichern???
Ganz einfach. Ich nehme jetzt mal als Beispiel Byte-Variablen:
Delphi-Quellcode:
Und:
var datei: File of Byte
begin AssignFile (datei, 'C:\datei.dat'); ReWrite (datei); Write (datei, DeinByte); CloseFile (datei);
Delphi-Quellcode:
P.S. siehe Signatur ...
var datei: File of Byte
begin AssignFile (datei, 'C:\datei.dat'); Reset (datei); Read (datei, ErstesByte); Read (datei, ZweitesByte); CloseFile(datei); |
Re: Smallint und Byte in einer Datei speichern???
OK, typisierte Datei ist vielleicht nicht ganz korrekt, denn du speicherst ja nicht nur einen bestimmten Record bestimmte Male ab, sondern nur einzelne Bytes bzw. Smallints.
Ich würde einen Filestream empfehlen, damit bist du flexibler als mit den alten Pascal-Files. Du schreibst also ganz einfach per TFileStream.Write deine Zahlen in die Datei mit Sizeof(Datentyp) als Größe. Dann musst du nur noch irgendwo (am besten am Anfang) festhalten, wie viele Daten welchen Datentyps gespeichert sind, damit die Datei auch wieder ausgelesen werden kann. |
Re: Smallint und Byte in einer Datei speichern???
@ jfheins: Danke, das hatte ich schon, ich brauchte was um verschiedene VariablenTypen zu schreiben.
@ Chewie: Danke das hat mich weitergebracht, und zwar hierher: schreiben:
Delphi-Quellcode:
Lesen:
stream: TFilestream;
a:integer; begin stream:=TFileStream.Create(Filename,fmcreate or fmShareExclusive); a:=213213; stream.Write(a,16); stream.Destroy; //Filename ist eine String-Konstane
Delphi-Quellcode:
Meine Idee war, die beiden Smallints (sind immer Zwei) in die ersten 2*16 Bit zu schreiben, und dann die Bytes in 8 Bits jeweils bis ans Ende der Datei zu schreiben.
stream:=TFileStream.Create(fame, fmOpenRead or fmShareExclusive);
Stream.Read(a,16); showmessage(inttostr(a)); stream.destroy; Jetzt hab ich das Problem, dass mein Lesen zwar die '213213' richtig angezeigt werden, dann aber eine AV bekomme. Ich seh da leider nicht, für was ich die verdient habe :pale: |
Re: Smallint und Byte in einer Datei speichern???
Wo ist denn der Code dafür? In dem was ich da sehe rufst du ein Stream.Destroy auf - damit bekommst du natürlich eine AV wenn du weiter auf Stream zugreifst.
PS: nimmer mal lieber Free bzw. FreeAndNil statt Destroy |
Re: Smallint und Byte in einer Datei speichern???
Das sind zwei unabhängige Procedures die jeweils ein Stream: tFilestream als lokale Variable haben. Da dürfte es eigenlich nicht zu Problemen kommen.
Was ist der Vorteil von Free, bzw FreeandNil?? Da das meine erste Verwendung von FileStream ist, wollte ich erstmal das Speichern von einem Smallint testen, der Rest kommt dann, wenn das gut klappt. Danke |
Re: Smallint und Byte in einer Datei speichern???
Ja, aber wo ist denn der Code zum weiteren Bytes lesen/schreiben? Ohne Code ist Fehlerdiagnose bissl schwehr... ich dachte mir, vielleicht hast du dein destroy einfach an der falschen stelle...
|
Re: Smallint und Byte in einer Datei speichern???
mehr hab ich noch nicht. Ich bin erst noch ein bischen am Testen.
Delphi-Quellcode:
Beim Aufruf bin ich mir sicher, dass da nichts komisches reinkommen kann.
procedure LoadFilestream(fname: string);
var stream: TFilestream; a:integer; begin stream:=TFileStream.Create(fname, fmOpenRead or fmShareExclusive); Stream.Read(a,16); showmessage(inttostr(a)); stream.destroy; end; procedure SaveFileStream(filename: string); var stream: TFilestream; a:integer; begin stream:=TFileStream.Create(Filename,fmcreate or fmShareExclusive); a:=213213; stream.Write(a,16); stream.Destroy; end; Das ist bis jetzt alles und ich seh keinen Fehler :wall: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:18 Uhr. |
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