Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ASCII-String und Binärtdaten in eine Datei schreiben (https://www.delphipraxis.net/175269-ascii-string-und-binaertdaten-eine-datei-schreiben.html)

drunky1337 10. Jun 2013 13:35

ASCII-String und Binärtdaten in eine Datei schreiben
 
Hallo Leutz,

ich möchte gerne eine Datei erstellen, in der sowohl ASCII-Strings (Header meiner Datei) als auch Binärtdaten enthalten sein sollen.

Mein erster Versuch war es die ASCII-Strings in eine StringListe zu schreiben und zum Schluss die Binärdaten über einen MemoryStream hinzuzufügen.
Leider scheitert das auch hier schon.
Ich kann die Strings problemlos in die StringList schreiben und diese als Datei speichern,
wenn ich aber

Delphi-Quellcode:
  Header.SaveToFile('C:\EDMSWAP\Header.hdf'); // 64kB groß
  Stream := getBinaryData(file_one);
  Stream.SaveToFile('C:\EDMSWAP\Data.hdf'); // 400 Byte groß
  Header.LoadFromStream(Stream);
  Header.SaveToFile('C:\EDMSWAP\HeaderAfterLoadFromStream.hdf'); // 2 Byte groß
ausführe hat meine StringList keinen Inhalt mehr und ist nur noch 2 Byte groß.
Ich vermute mal das LoadFromStream den kompletten Inhalt meiner StringList ersetzt.
Diese StringList hat zusätzlich Probleme mit den Binärdaten und intepretiert diese möglicherweise als irgendwelche Steuerzeichen und deshalb nur 2 Byte groß ist.

Langsam denke ich das die StringList für meine Anforderung erst gar nicht geeignet ist, leider bin ich in diesem Thema noch ganz am Anfang und würde mich sehr darüber freuen, wenn mich jemand auf die richtige Spurr schickt.

Mit freundlichen Grüßen

Arthur W.

sx2008 10. Jun 2013 13:39

AW: ASCII-String und Binärtdaten in eine Datei schreiben
 
Wenn du aus einem Stream liest in den du gerade geschrieben hast, muss du den Streamzeiger wieder zurücksetzen:
Delphi-Quellcode:
Stream := getBinaryData(file_one);
Stream.SaveToFile('C:\EDMSWAP\Data.hdf');
Stream.Position := 0; // <==
Header.LoadFromStream(Stream);
PS: ich hör schon aus der Ferne, wie deine Hand auf die Stirn klatscht :-)

DeddyH 10. Jun 2013 13:42

AW: ASCII-String und Binärtdaten in eine Datei schreiben
 
Wenn Du weißt, wann die Strings zu Ende sind und die Binärdaten anfangen, könntest Du das auch mit mehreren Streams lösen, sofern ich keinen Denkfehler mache: ein "Komplett"-MemoryStream, in den Du mittels Stringlist.SaveToStream Deine Strings hineinschreibst, dann noch einen für die Binärdaten, welchen Du mit CopyFrom an den anderen anhängst. Bei Bedarf kannst Du dann alle einzeln in Dateien speichern.

drunky1337 10. Jun 2013 13:57

AW: ASCII-String und Binärtdaten in eine Datei schreiben
 
Zitat:

Zitat von sx2008 (Beitrag 1218044)
Wenn du aus einem Stream liest in den du gerade geschrieben hast, muss du den Streamzeiger wieder zurücksetzen:
Delphi-Quellcode:
Stream := getBinaryData(file_one);
Stream.SaveToFile('C:\EDMSWAP\Data.hdf');
Stream.Position := 0; // <==
Header.LoadFromStream(Stream);
PS: ich hör schon aus der Ferne, wie deine Hand auf die Stirn klatscht :-)

Das mit der Position hatte ich auch schon versucht, das Ergebnis war leider trotzdem das gleiche.

Mit Hilfe von DeddyH seiner Idee habe ich mein Problem nun lösen können.

Delphi-Quellcode:
  DataStream := TMemoryStream.Create;
  Header.SaveToStream(DataStream);
  Stream := getBinaryData(file_one);
  Stream.SaveToStream(DataStream);
  DataStream.SaveToFile('C:\EDMSWAP\FullStream.hdf');
Ich schreibe jetzt in meinen neuen DataStream zuerst die StringList und anschließend die Binärdaten. Wenn ich jetzt diesem Stream als Datei abspeichere habe ich meine gewünschte Datei.

Vielen Dank für die schnellen Antworten :)


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