Entwickler-Ecke

Dateizugriff - Array of String in .txt abspeichern


Nilius - Mo 23.05.11 12:46
Titel: Array of String in .txt abspeichern
Hallo, habe eben in der Suche gesucht, aber da findet man immer nur verweise wie man es denn bitte auf eine andere Art machen soll. Ich hab jetzt einen Array of String und möchte diesen einfach über writeln in ne txt speichern. Mein problem is nur dass er mior jedesmal sagt dass es probleme mit zugriffsverletzungen gibt und ich grad net mehr rausfinde warum. wäre nett wenn man mir meinen fehler aufzeigen könnte :)


Hier der quelltext der entsprechenden Prozedur:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button2Click(Sender: TObject);
var i:integer; f:textfile;
begin
    begin
      Assignfile(f, 'C:\Datenbank.txt');
      ReWrite(f);
      for i:=0 to (Length(Daten)) do WriteLn(f, daten[i]);
      CloseFile(f);
    end;
  close;
end;


Daten ist hierbei der Global definierte Array of String (dynamisch)


Interessanterweise funktioniert eigentlich alles, d.h. die textdatei wird erstellt und die daten werden auch reingeschrieben. nur gibt er jedesmal ne fehlermeldung aus: "Zugriffsverletzung bei Adresse 00404A07 in Modul "Project1.exe". Lesen von Adresse 0000004A."


bummi - Mo 23.05.11 12:54

>> das Problem liegt hier: 0 to (Length(Daten))


Delphi-Quelltext
1:
2:
3:
.. 0 to (Length(Daten) - 1) ..
//besser
For i := Low(Daten) to High(Daten) do


Gausi - Mo 23.05.11 12:54

Die Indizes in einem Array gehen von 0 bis Length - 1. ;-)


Narses - Mo 23.05.11 12:57

Moin und :welcome: im Forum!

Ein dynamisches Array der Länge N fängt bei 0 an und geht bis N-1. :idea: Du hast aber auch noch den Index N verwendet - und den gibt´s nicht, deshalb die Exception. ;) Probier das mal so:
user profile iconNilius hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button2Click(Sender: TObject);
  var
    i: Integer;
    f: Textfile;
begin
  Assignfile(f, 'C:\Datenbank.txt');
  ReWrite(f);
  for i := 0 to High(Daten) do // 0..Max-1
    WriteLn(f, daten[i]);
  CloseFile(f);
end;

user profile iconNilius hat folgendes geschrieben Zum zitierten Posting springen:
habe eben in der Suche gesucht, aber da findet man immer nur verweise wie man es denn bitte auf eine andere Art machen soll.
Nicht ohne Grund, sowas kann man sehr viel besser mit einer TStringList erledigen. Die hat auch gleich eine passende Methode zu Speichern und Laden dabei. :think:

cu
Narses

//EDIT: Mudda, bin ich langsam... :(


HeftCD - Mo 23.05.11 13:04

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
//EDIT: Mudda, bin ich langsam... :(
Du wirst älter :)

Moderiert von user profile iconNarses: Zitat repariert.


Nilius - Mo 23.05.11 13:41

Danke an alle Antworten^^ Jetzt funzt es endlich. Und zum Thema dass kann man besser lösen: Ich find genau diese Variante sehr schön, weil man eben nicht noch wieder neue Sachen dazudefiniern muss und ich außerdem hiermit am besten klar komme und es am übersichtlichsten finde. Und bei den Programmgrößen die Otto-Normal hier bastelt, merkt der moderne Rechner eh kein Unterschied mehr ob das jetzt etwas effektiver ist oder nicht ;)


delfiphan - Mo 23.05.11 18:09

Ein bisschen deklarativer:

Delphi-Quelltext
1:
2:
3:
4:
5:
var
  S: string;
begin
  for S in Daten do
    ...