![]() |
TFileStream: String variabler Länge einlesen?
Hallo,
ich habe mich mal intensiever mit TStream bzw. TFileStream und dem Einlesen von Dateien beschäftigt. In den betreffenden Datein ist jeweils die Länge des Strings in 4 Byte angegeben und dann folgt der String. usw. Also habe ich mir folgenden Code geschrieben:
Delphi-Quellcode:
Das funktioniert zwar, allerdings beim zweiten Schleifendurchlauf gibt es bei SetLength() eine Zugriffsverletzung.
var Stream: TFileStream; s: String; c: Cardinal;
{...} repeat Stream.Read(c, 4); // Größe einlesen SetLength(s, c); // Länge des Strings setzen Stream.Read(s, c); // String einlesen ShowMessage(s); until Stream.Position >= Stream.Size; {...} Zitat:
|
Re: TFileStream: String variabler Länge einlesen?
Was für einen wert hat dann c?
|
Re: TFileStream: String variabler Länge einlesen?
Moin Martin,
ich sehe da nur einen Fehler: Irgendwie kann ich mir nicht vorstellen, dass das auch nur einmal funktioniert
Delphi-Quellcode:
es müsste so aussehen:
Stream.Read(s, c); // String einlesen
Delphi-Quellcode:
Stream.Read(s[1], c); // String einlesen
|
Re: TFileStream: String variabler Länge einlesen?
Zitat:
Hatte mich halt vorher noch nie so mit FileStream beschäftigt. Danke! Zitat:
Zitat:
|
Re: TFileStream: String variabler Länge einlesen?
Also ne andere Variante war, dass ich einen String konstanter Länge genommen habe:
Delphi-Quellcode:
Das hat funktioniert!
var Stream: TFileStream; s: array[0..255] of Char; c: Cardinal;
{...} repeat Stream.Read(c, 4); // Größe einlesen Stream.Read(s, c); // String einlesen ShowMessage(s); until Stream.Position >= Stream.Size; {...} Aber hätte ich dann nicht auch s[0] beim Einlesen nehmen müssen? |
Re: TFileStream: String variabler Länge einlesen?
Moin Martin,
nein, wenn Du ein Array hast, das explizit beim Index 0 anfängt, musst Du natürlich 0 angeben, bei einem Huge-String (Standardwert von string) beginnt der Inhalt beim Index 1. [EDIT] ist schon spät :wall: Ein String ist erst einmal ein Pointer, auf den Speicherbereich, und man muss dem Compiler erst einmal sagen, was man möchte. Bei so einem Array kannst Du den Wert angeben, musst es aber nicht, da der Compiler das selber mitbekommt. [/EDIT] |
Re: TFileStream: String variabler Länge einlesen?
Ja das ist schon klar, aber bei einem statischen Array hat es auch so geklappt:
Delphi-Quellcode:
anstatt den Index des ersten Elements zu übergeben:
Stream.Read(s, c);
Delphi-Quellcode:
Stream.Read(s[0], c);
|
Re: TFileStream: String variabler Länge einlesen?
|
Re: TFileStream: String variabler Länge einlesen?
Zitat:
Gut, jetzt habe ich das auch soweit verstanden wie es in der Code-Lib steht. Eine Frage noch: Wie sieht es mit Strings fester Länge aus, z.B. String[4] ? Irgendwie klappt das überhaupt nicht mit dem Einlesen, weder mit s[0] noch mit s[1] :gruebel: |
Re: TFileStream: String variabler Länge einlesen?
Moin Martin,
bei einem ShortString steht in s[0] die Länge. Mit s[1] müsste das gehen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:15 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 by Thomas Breitkreuz