AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Nutzung MemoryStream und FileStream

Ein Thema von BasilBavaria · begonnen am 18. Mai 2011 · letzter Beitrag vom 19. Mai 2011
Antwort Antwort
Seite 1 von 2  1 2      
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#1

AW: Nutzung MemoryStream und FileStream

  Alt 18. Mai 2011, 10:48
Somit entsteht am Ende eine feste Struktur (Memorystream.Size = 4933).
Diese wird dann in einem Filestream gespeichert. Bei 10 Einträgen stehen also 10 Datenstrukturen im Filestream
Sehr gefährlich darauf zu vertrauen, dass es immer 4933 Bytes sind.
Irgendwo ein Byte mehr oder weniger (und das ist eigentlich bei TReader/TWriter zwangsläufig so) und die gesamten Daten sind unlesbar.
Was hier fehlt ist eine Art Archivstruktur, die kein Problem damit hat, dass die Einträge unterschiedlich lang sind.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#2

AW: Nutzung MemoryStream und FileStream

  Alt 18. Mai 2011, 14:17
du könntest deine Struktur noch um 4 Bytes vornedran erweitern (4 Bytes = Integer). Dieser Integer gibt dann sicherheitshalber an, wie lange dein Datensatz ist. Die Länge musst du nicht verwenden, aber kannst dich im Fehlerfall schnell zwischen den Strukturen hin und her bewegen und diese auch in verschiedene Dateien splitten. Somit wären im Fehlerfal auch nicht gleich alle Daten weg.

aber die Datenstruktur sieht ungefähr aus Kopf so aus:

Code:
tKarte = record
     SNr    : integer;        
     ID     : Cardinal;    
     Del    : boolean;    
     KID    : Cardinal;  
     CDate  : TDateTime;
     L1,
     L2,
     L3,
     L4,
     L5,                   //echte Länge der Daten
     L6      : word;       //Längenfelder für 6 strings
     Titel  : string;     //255
     Info1   : string;     //255
     Info2   : string;     //255
     DokFile : string;     //L=1024
     WWWRef : string;     //L=1024
     Memo   : string;     //L=2048
     Termin : TDateTime;
     TStatus : byte;      
  end;
Autsch. Das Problem bei der Sache dürfte wohl sein, dass deine Strings wohl nicht immer die gleiche Länge haben
Ansonsten schöne Struktur. Kann man prima in eine DB speichern.

@Sir Rufo
für 20Kb gleich einen Feuervogel anschleppen?
Warum nicht. Dann hat die DB das Problem mit dem Speichern und die kann das. Außerdem könnten es ja mehr Daten werden.

Bernhard
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Nutzung MemoryStream und FileStream

  Alt 18. Mai 2011, 15:05
Du kannst/solltest statt "String" einen "ShortString" oder einen String[X] (X = 1 bis 255) benutzen.
Wenn dir für alle Felder maximal 255 Zeichen reichen, dann ist das kein Problem und das Laden & Speichern des Records wird ein Kinderspiel!

Edit: Ich sehe grade du hast auch längere Strings. Dann kannst du alternativ Array[0..Länge-1] of (Ansi)Char benutzen! Delphi behandelt die Arrays wie PChars und deswegen kannst du damit fast so arbeiten wie mit richtigen Strings!
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#4

AW: Nutzung MemoryStream und FileStream

  Alt 18. Mai 2011, 17:03
Wo wir eh gerade bei Chars und AnsiChars/WideChars sind: Falls du noch Strings und Chars hast, die auf AnsiStrings und AnsiChars verweisen, ist deine Struktur spätestens nach einem Wechsel auf Delphi >= 2009 im Eimer. Also am Besten gleich WideStrings und WideChars verwenden. Dann sind die auch kompatibel und die Struktur ändert sich erst wieder mit der Einführung von UTF-32.

Bernhard

ADD: Turbo Delphi hat noch AnsiStrings und AnsiChars (sowie PAnsiChars). Wenn du in Erwägung ziehst, irgendwann mal eine neue Delphi-Version einzusetzen, würde ich empfehlen, Wide* zu verwenden, da du dann weniger Probleme hast.
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#5

AW: Nutzung MemoryStream und FileStream

  Alt 18. Mai 2011, 17:09
Das gilt allerdings nicht für Shortstrings, diese sind AFAIK immer ANSI-kodiert.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#6

AW: Nutzung MemoryStream und FileStream

  Alt 18. Mai 2011, 17:15
Das gilt allerdings nicht für Shortstrings, diese sind AFAIK immer ANSI-kodiert.
Ja, aus Gründen der Abwärtskompatibilität.

Bernhard
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#7

AW: Nutzung MemoryStream und FileStream

  Alt 18. Mai 2011, 17:59
Na also, wenn er also in seinem Record lediglich Shortstrings ablegt, sollten die einen Wechsel zu einer aktuellen Delphi-Version auch schadlos überstehen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
BasilBavaria

Registriert seit: 18. Mai 2011
Ort: Niederbayern
22 Beiträge
 
Turbo Delphi für Win32
 
#8

AW: Nutzung MemoryStream und FileStream

  Alt 19. Mai 2011, 08:20
Ich hab die Größenprüfungen eingebaut und etwas gefunden:

Die Size des Streams ändert sich anscheinend, wenn Umlaute und Sonderzeichen wie 'ß' im String enthalten sind.
Die Erweiterung des String liefert noch einen korrekten String
Code:
Writer.WriteString( StrExt(KartenSatz.Info1,true,cszInfo1) );
Beim Prüfen vor Update/Schreiben ist der Stream bei einem Umlaut um 4 Byte vergößert (4937 statt 4933) - bei zwei Umlauten aber nur auf 4938 Byte???
Der String "öß cnchjhj Ä ..kjhk ß" liefert 4940 Byte.
Bei Umlauten in zwei Feldern 4941 Byte usw.

Der Fehler scheint also bei Writer zu liegen - aber warum? In der Onlinehilfe hab ich nix gefunden.
Die Zeiten ändern sich Früher traute ich keinem Computer, den ich nicht mehr tragen kann - heute keinem, den ich nicht mehr sehen kann ...
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Nutzung MemoryStream und FileStream

  Alt 19. Mai 2011, 08:24
Dann schreib halt notfalls selbst in den Stream
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#10

AW: Nutzung MemoryStream und FileStream

  Alt 19. Mai 2011, 08:29
Der Record mit ShortStrings kann übrigens direkt in den Stream kopiert werden.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:38 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