AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi TFileStream: String variabler Länge einlesen?
Thema durchsuchen
Ansicht
Themen-Optionen

TFileStream: String variabler Länge einlesen?

Ein Thema von Martin K · begonnen am 15. Aug 2007 · letzter Beitrag vom 16. Aug 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#1

TFileStream: String variabler Länge einlesen?

  Alt 15. Aug 2007, 22:28
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?
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: TFileStream: String variabler Länge einlesen?

  Alt 15. Aug 2007, 22:32
Was für einen wert hat dann c?
Markus Kinzler
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: TFileStream: String variabler Länge einlesen?

  Alt 15. Aug 2007, 22:32
Moin Martin,

ich sehe da nur einen Fehler:

Irgendwie kann ich mir nicht vorstellen, dass das auch nur einmal funktioniert
Stream.Read(s, c); // String einlesen es müsste so aussehen:
Stream.Read(s[1], c); // String einlesen
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: TFileStream: String variabler Länge einlesen?

  Alt 15. Aug 2007, 22:35
Zitat von Christian Seehase:
es müsste so aussehen:
Stream.Read(s[1], c); // String einlesen
Danke, das wars

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


Zitat von mkinzler:
Was für einen wert hat dann c?
Zitat von Martin K:
Delphi-Quellcode:
var Stream: TFileStream; s: String; c: Cardinal;
{...}
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: TFileStream: String variabler Länge einlesen?

  Alt 15. Aug 2007, 22:40
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?
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: TFileStream: String variabler Länge einlesen?

  Alt 15. Aug 2007, 22:43
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

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]
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: TFileStream: String variabler Länge einlesen?

  Alt 15. Aug 2007, 22:46
Ja das ist schon klar, aber bei einem statischen Array hat es auch so geklappt:
  Stream.Read(s, c); anstatt den Index des ersten Elements zu übergeben:
  Stream.Read(s[0], c);
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#8

Re: TFileStream: String variabler Länge einlesen?

  Alt 15. Aug 2007, 22:51
Hallo Martin,

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

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: TFileStream: String variabler Länge einlesen?

  Alt 15. Aug 2007, 23:09
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]
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: TFileStream: String variabler Länge einlesen?

  Alt 15. Aug 2007, 23:21
Moin Martin,

bei einem ShortString steht in s[0] die Länge. Mit s[1] müsste das gehen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  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 04:31 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