AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TFileStream - EOutOfMemory

Ein Thema von xineohp · begonnen am 11. Feb 2008 · letzter Beitrag vom 12. Feb 2008
Antwort Antwort
xineohp

Registriert seit: 29. Jan 2004
Ort: Heusenstamm
420 Beiträge
 
Delphi 2005 Professional
 
#1

TFileStream - EOutOfMemory

  Alt 11. Feb 2008, 22:05
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;
Peter Enenkel
blubb
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.041 Beiträge
 
Delphi XE2 Professional
 
#2

Re: TFileStream - EOutOfMemory

  Alt 11. Feb 2008, 23:44
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.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
xineohp

Registriert seit: 29. Jan 2004
Ort: Heusenstamm
420 Beiträge
 
Delphi 2005 Professional
 
#3

Re: TFileStream - EOutOfMemory

  Alt 11. Feb 2008, 23:47
hm, also eigentlich möchte ich die Datei zeichenweise einlesen. Ich bin offen für Vorschläge.
Peter Enenkel
blubb
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: TFileStream - EOutOfMemory

  Alt 12. Feb 2008, 00:27
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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: TFileStream - EOutOfMemory

  Alt 12. Feb 2008, 07:13
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
  Mit Zitat antworten Zitat
xineohp

Registriert seit: 29. Jan 2004
Ort: Heusenstamm
420 Beiträge
 
Delphi 2005 Professional
 
#6

Re: TFileStream - EOutOfMemory

  Alt 12. Feb 2008, 13:37
ah, ok, danke für die Informationen, ich befürchte ich hatte keine Ahnung was ich mit dem Stream eigentlich mache
Peter Enenkel
blubb
  Mit Zitat antworten Zitat
Thomas Horstmann

Registriert seit: 25. Apr 2007
86 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: TFileStream - EOutOfMemory

  Alt 12. Feb 2008, 14:45
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:26 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