Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TFileStream - EOutOfMemory (https://www.delphipraxis.net/108332-tfilestream-eoutofmemory.html)

xineohp 11. Feb 2008 22:05


TFileStream - EOutOfMemory
 
Hi,

ich versuche eine Datei per FileStream auszulesen, aber ich bekomme immer einen EOutOfMemory Error und habe keine Ahnung was ich falsch mache. Die Testdatei ist im übrigen nicht mal ein Kb groß, zu ein einziger Satz.

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  Stream: TFileStream; s: String; c: Cardinal;
begin
  Stream := TFileStream.Create('C:\test.txt', fmOpenRead );

  repeat
    Stream.Read(c, 4); // Größe einlesen
    SetLength(s, c); // Länge des Strings setzen
    Stream.Read(s[1], c); // String einlesen
    memo1.Lines.Add(s);
  until Stream.Position >= Stream.Size;

  Stream.Free;
end;

Amateurprofi 11. Feb 2008 23:44

Re: TFileStream - EOutOfMemory
 
Zitat:

Zitat von xineohp
Hi,

ich versuche eine Datei per FileStream auszulesen, aber ich bekomme immer einen EOutOfMemory Error und habe keine Ahnung was ich falsch mache. Die Testdatei ist im übrigen nicht mal ein Kb groß, zu ein einziger Satz.

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  Stream: TFileStream; s: String; c: Cardinal;
begin
  Stream := TFileStream.Create('C:\test.txt', fmOpenRead );

  repeat
    Stream.Read(c, 4); // Größe einlesen
    SetLength(s, c); // Länge des Strings setzen
    Stream.Read(s[1], c); // String einlesen
    memo1.Lines.Add(s);
  until Stream.Position >= Stream.Size;

  Stream.Free;
end;

Was erwartest du denn, was die erste Zeile innerhalb der repeat-Schleife macht ?
Ich habe mich mit Streams nie beschäftigt, aber ich gehe davon aus, daß sie die ersten 4 Zeichen der Datei aus der Datei in die Variable c kopiert.
Wenn z.B. Die Datei mit dem Wort "Hallo" beginnt, dann würde ich erwarten, dann c dann den Wert $6C6C6148 (=1819042120) enthält.
Das ist dann aber nicht die Länge der Zeile.

xineohp 11. Feb 2008 23:47

Re: TFileStream - EOutOfMemory
 
hm, also eigentlich möchte ich die Datei zeichenweise einlesen. Ich bin offen für Vorschläge.

Muetze1 12. Feb 2008 00:27

Re: TFileStream - EOutOfMemory
 
Ist denn das erste LongWord der Datei definitiv die Länge? Wenn da 12 Millionen o.ä. rauskommt, dann wird es mit dem String schnell zu gross beim SetLength. Schonmal debuggt auf Stringlängen er denn so kommt?

marabu 12. Feb 2008 07:13

Re: TFileStream - EOutOfMemory
 
Moin,

ich glaube, dass die kleine Datei namens TEST.TXT eine reine Textdatei ist. Peter möchte wohl das zeilenweise Lesen mit einem FileStream an Stelle eines TextFile erledigen. Das zeilenweise Lesen von Textdateien geschieht immer auf die gleiche Weise: Einlesen eines Blocks, Suchen nach dem Zeilenende, Merken der gepufferten Dateiposition. Genau diese Funktionalität steckt in TextFile und muss in einer von TFileStram abgeleiteten Klasse nachgebaut werden. Längeninformationen gibt es in einer Textdatei nunmal nicht.

Freundliche Grüße

xineohp 12. Feb 2008 13:37

Re: TFileStream - EOutOfMemory
 
ah, ok, danke für die Informationen, ich befürchte ich hatte keine Ahnung was ich mit dem Stream eigentlich mache :roll:

Thomas Horstmann 12. Feb 2008 14:45

Re: TFileStream - EOutOfMemory
 
Hallo,
wenn Du eine Textdatei zeilenweise lesen willst, versuche folgendes.

Delphi-Quellcode:
procedure LoadFile
( iFileName : String ) ;
var
iTextFile : TextFile ;
iTextLine : String ;
begin
{ Ggf. Nicht vorhanden, abbrechen }
if FileExists(iFileName) = FALSE then Exit ;

{ TextFile öffnen }
AssignFile(iTextFile,iFileName) ;
Reset(iTextFile) ;

{ Zeilenweise lesen und in iTextLine speichern }
while not(EOF(iTextFile)) do
  begin
  ReadLn(iTextFile,iTextLine) ;
  end ; // while not

{ TextFile schliessen }
CloseFile(iTextFile) ;
end ;
Viele Grüsse
Tom


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