Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Smallint und Byte in einer Datei speichern??? (https://www.delphipraxis.net/29336-smallint-und-byte-einer-datei-speichern.html)

Nikolas 7. Sep 2004 19:10


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

Chewie 7. Sep 2004 19:12

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.

Nikolas 7. Sep 2004 19:15

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

jfheins 7. Sep 2004 19:41

Re: Smallint und Byte in einer Datei speichern???
 
Ganz einfach. Ich nehme jetzt mal als Beispiel Byte-Variablen:

Delphi-Quellcode:
var datei: File of Byte
begin
AssignFile (datei, 'C:\datei.dat');
ReWrite (datei);
Write (datei, DeinByte);
CloseFile (datei);
Und:
Delphi-Quellcode:
var datei: File of Byte
begin
AssignFile (datei, 'C:\datei.dat');
Reset (datei);
Read (datei, ErstesByte);
Read (datei, ZweitesByte);
CloseFile(datei);
P.S. siehe Signatur ...

Chewie 7. Sep 2004 19:46

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 Delphi-Referenz durchsuchenTFileStream.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.

Nikolas 7. Sep 2004 20:36

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:
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
Lesen:
Delphi-Quellcode:
stream:=TFileStream.Create(fame, fmOpenRead or fmShareExclusive);  
Stream.Read(a,16);
showmessage(inttostr(a));
stream.destroy;
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.
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:

fiasko 7. Sep 2004 20:59

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

Nikolas 7. Sep 2004 21:07

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

fiasko 7. Sep 2004 21:10

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

Nikolas 7. Sep 2004 21:17

Re: Smallint und Byte in einer Datei speichern???
 
mehr hab ich noch nicht. Ich bin erst noch ein bischen am Testen.
Delphi-Quellcode:
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;
Beim Aufruf bin ich mir sicher, dass da nichts komisches reinkommen kann.

Das ist bis jetzt alles und ich seh keinen Fehler :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:18 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