Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TFileStream: String variabler Länge einlesen? (https://www.delphipraxis.net/97763-tfilestream-string-variabler-laenge-einlesen.html)

Martin K 15. Aug 2007 21:28


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:
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;

{...}
Das funktioniert zwar, allerdings beim zweiten Schleifendurchlauf gibt es bei SetLength() eine Zugriffsverletzung.
Zitat:

Zugriffsverletzung bei Adresse 00404694 in Modul 'Project1.exe'. Lesen von Adresse 4C534439.
Hat jemand eine Idee? Was mache ich falsch?

mkinzler 15. Aug 2007 21:32

Re: TFileStream: String variabler Länge einlesen?
 
Was für einen wert hat dann c?

Christian Seehase 15. Aug 2007 21:32

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:
Stream.Read(s, c); // String einlesen
es müsste so aussehen:
Delphi-Quellcode:
Stream.Read(s[1], c); // String einlesen

Martin K 15. Aug 2007 21:35

Re: TFileStream: String variabler Länge einlesen?
 
Zitat:

Zitat von Christian Seehase
es müsste so aussehen:
Delphi-Quellcode:
Stream.Read(s[1], c); // String einlesen

Danke, das wars :thumb:

Hatte mich halt vorher noch nie so mit FileStream beschäftigt.
Danke!


Zitat:

Zitat von mkinzler
Was für einen wert hat dann c?

Zitat:

Zitat von Martin K
Delphi-Quellcode:
var Stream: TFileStream; s: String; c: Cardinal;
{...}

:roll:

Martin K 15. Aug 2007 21:40

Re: TFileStream: String variabler Länge einlesen?
 
Also ne andere Variante war, dass ich einen String konstanter Länge genommen habe:
Delphi-Quellcode:
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;

{...}
Das hat funktioniert!
Aber hätte ich dann nicht auch s[0] beim Einlesen nehmen müssen?

Christian Seehase 15. Aug 2007 21:43

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]

Martin K 15. Aug 2007 21:46

Re: TFileStream: String variabler Länge einlesen?
 
Ja das ist schon klar, aber bei einem statischen Array hat es auch so geklappt:
Delphi-Quellcode:
  Stream.Read(s, c);
anstatt den Index des ersten Elements zu übergeben:
Delphi-Quellcode:
  Stream.Read(s[0], c);

Hawkeye219 15. Aug 2007 21:51

Re: TFileStream: String variabler Länge einlesen?
 
Hallo Martin,

du solltest hin und wieder in der Code-Library der DP stöbern: klick.

Gruß Hawkeye

Martin K 15. Aug 2007 22:09

Re: TFileStream: String variabler Länge einlesen?
 
Zitat:

Zitat von Christian Seehase
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.

Okay, danke.

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:

Christian Seehase 15. Aug 2007 22:21

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 11:44 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