Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit Laden einer Datei (ReadLn) (https://www.delphipraxis.net/71625-problem-mit-laden-einer-datei-readln.html)

Kasch 18. Jun 2006 16:35


Problem mit Laden einer Datei (ReadLn)
 
Hallo Leute,

bin starkt deprimiert, weil ich immer wieder einen schweren Absturz ernte, wenn ich Zeilen aus einer Datei auslesen will.
Mein Lade-Button:

Delphi-Quellcode:
procedure TForm1.btn_ladeClick(Sender: TObject);
var

    daten: array[1..1000] of string[64];
    a : Integer;
    datei: textfile;

begin


  AssignFile(datei,'e:\string.txt');
   reset(datei);
while not eof(datei) do
    begin
      inc (a);
      Readln(datei,daten[a]);
    end;

closefile(datei);


end;
Was mache ich so falsch, daß EAcessViolation "Zugriffverletzung bei Adress Bla Bla" entsteht?
Datei existiert, ist auch nicht offen oder so.
Ich will einfach nur jede Zeile dieser Datei in ein String-Array einlesen...

Wer kann mir da freundlicherweise helfen? Vielen Dank

mkinzler 18. Jun 2006 16:39

Re: Problem mit Laden einer Datei (ReadLn)
 
Was für ein wert hat a am Beginn der Schleife?
Ich würde ne stringList zum speichern der Strings nehmen.

Dax 18. Jun 2006 16:41

Re: Problem mit Laden einer Datei (ReadLn)
 
Wie mkinzler schon sagte wäre eine Stringlist besser:
Delphi-Quellcode:
var List: TStringList;
begin
  List := TStringList.Create;
  List.LoadFromFile(...);
end;
Wenn du aber bei deiner Methode bleiben möchtest, muss a zu beginn der Read-Schleife als Wert den ersten Index des Daten-Arrays tragen, also Low(daten), also 1. :)

Hawkeye219 18. Jun 2006 16:47

Re: Problem mit Laden einer Datei (ReadLn)
 
0, weil er die Variable a vor dem Lesen erhöht :wink:

Gruß Hawkeye

Dax 18. Jun 2006 16:48

Re: Problem mit Laden einer Datei (ReadLn)
 
Oh, stimmt :) Habs falschrum gelesen, sorry. Glaub mir nicht, Hawk hat Recht ^^

mkinzler 18. Jun 2006 16:58

Re: Problem mit Laden einer Datei (ReadLn)
 
Tatsache ist aber, das der wert in dem geposteten Code nie gesetzt wird.

Daniel G 18. Jun 2006 17:01

Re: Problem mit Laden einer Datei (ReadLn)
 
Zitat:

Zitat von Dax
Tatsache ist aber, das der wert in dem geposteten Code nie gesetzt wird.

Tatsache ist aber auch, dass Dax ihn darauf schon hingewiesen hat. ;)
Zitat:

Zitat von Dax
Wenn du aber bei deiner Methode bleiben möchtest, muss a zu beginn der Read-Schleife als Wert den ersten Index des Daten-Arrays tragen, also Low(daten), also 0. :)


mkinzler 18. Jun 2006 17:02

Re: Problem mit Laden einer Datei (ReadLn)
 
Ich auch. ;-)

Kasch 18. Jun 2006 17:06

Re: Problem mit Laden einer Datei (ReadLn)
 
Hallo,

vielen Dank. Ich nehme den Stringlist-Vorschlag dankend an!
Hatt alles perfekt funktioniert.

Habe aber immer noch nicht verstanden, warum es zu dieser Fehlermeldung kam.
Kann das mir einer bitte noch erklären?
Vielen Dank

mkinzler 18. Jun 2006 17:11

Re: Problem mit Laden einer Datei (ReadLn)
 
Vielleicht am n?

Kasch 18. Jun 2006 17:16

Re: Problem mit Laden einer Datei (ReadLn)
 
du meinst alle "n" rauslöschen? :roll:

mkinzler 18. Jun 2006 17:17

Re: Problem mit Laden einer Datei (ReadLn)
 
nein abber es auf den Wert 0 setzen, bevor du es benutzt.

Siehe dazu auch schon mehrere Beiträge in diesem Thread ( von mir, Dax, Hawkeye219)

Helmi 18. Jun 2006 17:21

Re: Problem mit Laden einer Datei (ReadLn)
 
Hallo,

wie meine "Vorredner" schon sagten, die Variable a muss auf 0 gesetzt werden.

Du solltest vielleicht auch einen try/finally-Block einfügen.

so z. B.:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var

    daten: array[1..1000] of string[64];
    a : Integer;
    datei: textfile;

begin
  try
    AssignFile(datei,'d:\string.txt');
    reset(datei);
    a := 0;
    while not eof(datei) do
      begin
        inc (a);
        Readln(datei,daten[a]);
      end;
  finally
    closefile(datei);
  end;
end;

Kasch 18. Jun 2006 17:23

Re: Problem mit Laden einer Datei (ReadLn)
 
hallo,

hatte es vergessen zu schreiben, aber habe es gleich nach dem ersten Hinweis ausprobiert. Fehlermeldung ist nun eine andere, aber der schwere Absturz bleibt...

mkinzler 18. Jun 2006 17:27

Re: Problem mit Laden einer Datei (ReadLn)
 
Funktioniert es mit der Abwandlung?
Delphi-Quellcode:
     inc (a);
      Readln(datei,s);
      daten[a] := s;

Helmi 18. Jun 2006 17:34

Re: Problem mit Laden einer Datei (ReadLn)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Kann es sein, dass deine Textdatei größer ist als dein Array?

Ich hab das mal getestet und dann bekomm ich einen Fehler bei der Bereichsprüfung.

Wenn du mal die angehängte Datei als Test-Datei verwendest, dann wirst du merken, dass es bei Array[1..1000] funktioniert, aber bei Array[1..10] nicht mehr.

omata 18. Jun 2006 17:36

Re: Problem mit Laden einer Datei (ReadLn)
 
Und wieviel Zeilen sind in der Datei? Bei > 1000 knallt es auch...

Hawkeye219 18. Jun 2006 17:41

Re: Problem mit Laden einer Datei (ReadLn)
 
Hallo Kasch,

befolge Markus' ersten Rat und nimm eine TStringList. Die Verwendung des Arrays bringt viele Nachteile mit sich:
  • Was ist, wenn die Länge einzelner Zeilen den Wert 64 überschreitet? In diesem Fall kannst du die Zeilen nicht mehr vollständig verarbeiten, da du nur Platz für 64 Zeichen pro Zeile reserviert hast.
  • Was passiert, wenn die Datei mehr als 1000 Zeilen enthält? Dein Code stellt das nicht fest und schreibt in nicht reservierten Speicher (was übrigens auch den Absturz erklären würde).
  • Wenn die Zeilen der Datei unterschiedlich lang sind, mußt du trotzdem für jede Zeile den Platz für die maximale Zeilenlänge reservieren, da alle Arrayelemente den selben Typ besitzen müssen.
  • Du mußt die Anzahl der Zeilen bereits zur Compile-Zeit kennen, um dein Array zu dimensionieren.
Die Stringliste ist wesentlich flexibler und bietet dir mehr Möglichkeiten als das Array.

Gruß Hawkeye

//Edit: 2. Seite übersehen! :oops:


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