![]() |
String mit FileStream speichern
Hallo zusammen.
Ich möchte einfach einen String mit einem FileStream speichern. So hab ich es gemacht:
Delphi-Quellcode:
Leider steh in meiner Text Datei nicht das gewünschte Ergebnis sonder diese Hex Wert:
type
TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private FFileStream : TFileStream; public end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var MyString : String; LengthOfString : Integer; begin MyString := 'Hallo Welt' + #13#10; LengthOfString := Length(MyString); FFileStream.Write(MyString, LengthOfString); end; //------------------------------------------------------------------------------ procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin FreeAndNil(FFileStream); end; //------------------------------------------------------------------------------ procedure TForm1.FormCreate(Sender: TObject); begin FFileStream := TFileStream.Create('MyStream.txt', fmCreate, (fmShareDenyRead or fmShareDenyNone)); end; //------------------------------------------------------------------------------ end. C4 42 46 00 20 43 A1 00 04 F7 12 00 Was mache ich falsch? Vielen Dank |
Re: String mit FileStream speichern
Glaube das müsste gehen:
Delphi-Quellcode:
Strings sind nur Pointer auf eine Referenz-Struktur (oder so ähnlich)...
FFileStream.Write(MyString[1], LengthOfString);
//oder gleich FFileStream.Write(MyString[1], Length(MyString)); |
Re: String mit FileStream speichern
Du musst auf jeden Fall auch beachten, dass diese Lösung nur mit genau EINEM String funktioniert, da du sonst beim Zurücklesen des Filestreams nicht mehr weisst wie lang der String ist.
Normalerweise schreibst du als erstes die Länge des Strings in den Stream, danach den String selbst. Beim Lesen kannst du dann zuerst die Länge auslesen und anschließend die richtige Anzahl an Bytes für den String. Das funktioniert auch bei mehreren Strings (oder anderen Datenstrukturen mit nicht konstanter Länge). Beispiel. String1 = 'Hallo' String2 = 'Welt' Im korrekt gespeicherten Stream sollte jetzt stehen: 05 H a l l o 04 W e l t Einlesen: Zuerst die Länge = 5 dann fünf Zeichen - der Zeiger des Stream steht jetzt genau auf der Längeninformation des nächsten String = 4 dann vier Zeichen. |
Re: String mit FileStream speichern
Zitat:
|
Re: String mit FileStream speichern
Zitat:
drumm mußt du den Zeiger erstmal sozusagen dereferenzieren ... also z.B. via MyString[1] |
Re: String mit FileStream speichern
Zitat:
Aber natürlich hast du recht. Er könnte den Stream byteweise einlesen, bis ein Endezeichen erkannt wird. Ob dass allerdings performant ist? Zudem ist die Lösung, die Blocklänge (Stringlänge) voran zu stellen insofern wichtig, da damit in einem Stream alle möglichen Formate (Strings, Zahlenwerte, Bitmaps, Sounddaten, usw) auf diese Art gespeichert werden können. Man muss nur in der selben Reihenfolge wie beim Speichern einlesen. |
Re: String mit FileStream speichern
Zitat:
Delphi-Quellcode:
MyString := 'Hallo Welt'; // geht so nur wenn MyString <> '' ist
FFileStream.Write(MyString[1], Length(MyString) + 1); |
Re: String mit FileStream speichern
Zitat:
Zitat:
|
Re: String mit FileStream speichern
Zitat:
Blockweise (in geeigneten Blockgrößen) einlesen, darin suchen und wenn gefunden, dann zurückspringen oder gleich einen Lesepuffer einrichten. |
Re: String mit FileStream speichern
Zitat:
Delphi-Quellcode:
Sonst tritt wieder das weiter oben beschriebene Problem auf.
MyString := 'Hallo Welt'; // geht so nur wenn MyString <> '' ist
FFileStream.Write(MyString[1], Length(MyString) + 1); Ich würde auch einen Blick auf TStringStream empfehlen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 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