Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi mehrere Datensätze in Datei schreiben und wieder Auslesen (https://www.delphipraxis.net/58200-mehrere-datensaetze-datei-schreiben-und-wieder-auslesen.html)

saibotq 2. Dez 2005 21:16


mehrere Datensätze in Datei schreiben und wieder Auslesen
 
N'abend,

ich versuche in eine Datei mehrere Datensätze von einem benutzerdefinierten Typ reinzuschreiben. Das Problem ist, dass es irgendwie nicht klappt mehr als einen Datensatz in die Datei zu schreiben, ohne den ersten Datensatz zu überschreiben.

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var eingabe:Kontotyp;

begin
assignfile (KSK, 'KSK.dat');
rewrite (KSK);

seek(KSK,anzahl);

with eingabe do
begin
     nr:=edit3.text;
     pin:=edit4.text;
     stand:=strtofloat(edit5.text);
end;

write (KSK, eingabe);
inc(Anzahl);

closefile(KSK);

end;
Beim ersten mal, wo ich die Prozedur ausführe, schreibt das Programm die korrekten Daten in die Datei. Beim zweiten mal wird auch an der zweiten Position in der Datei geschrieben, aber dabei wird der erste Datensatz überschrieben...

Was kann ich tun?

sniper_w 2. Dez 2005 21:18

Re: mehrere Datensätze in Datei schreiben
 
Zitat:

procedure Rewrite(var F: File [; Recsize: Word ] );

Description

Rewrite creates a new external file with the name assigned to F.

F is a variable of any file type associated with an external file using AssignFile. RecSize is an optional expression, which can be specified only if F is an untyped file. If F is an untyped file, RecSize specifies the record size to be used in data transfers. If RecSize is omitted, a default record size of 128 bytes is assumed.

If an external file with the same name already exists, it is deleted and a new empty file is created in its place.
Was du brauchst ist Append stat rewrite...
Zitat:

Prepares an existing file for adding text to the end.

procedure Append(var F: Text);

saibotq 2. Dez 2005 21:29

Re: mehrere Datensätze in Datei schreiben
 
schon mal vielen dank, das erste problem ist gelöst :-D

jetzt kriege ich nur den fehler "Versuch hinter dem Dateiende zu lesen" an dieser Stelle:

Delphi-Quellcode:
while EOF(KSK)=false do
begin
read (KSK, vergleich);
if vergleich.nr=eingabe.nr then
   if vergleich.pin=eingabe.pin then
      label5.caption:=(floattostr(vergleich.stand));
end;
ich dachte mit "while EOF(KSK)=false" hätte ich ausgeschlossen, hinter dem dateiende zu lesen??

Hansa 3. Dez 2005 02:42

Re: mehrere Datensätze in Datei schreiben
 
Zitat:

Zitat von saibotq
Delphi-Quellcode:
// Datei öffnen
read (KSK, vergleich);
while not EOF(KSK) do begin
  if vergleich.nr=eingabe.nr then
    if vergleich.pin=eingabe.pin then
     label5.caption:=(floattostr(vergleich.stand));
  read (KSK, vergleich);
end;

Trifft das read auf ein Zeilenende und das ist bereits EOF, dann ist Ende und trotzdem wird ein Zugriff darauf gemacht. Dieser ist aber undefiniert -> Fehler.

P.S.: etwas genauer : am SCHLUß der while Schleife muß EOF stehen, dann landet man nicht mehr in der Schleife !!

tigerman33 3. Dez 2005 10:43

Re: mehrere Datensätze in Datei schreiben
 
Also z.B. so:
Delphi-Quellcode:
// Datei öffnen
if not EOF(KSK) then begin // ist überhaupt was drin?
  read (KSK, vergleich);
  if not EOF(KSK) then repeat // etwas unschön, muss aber sein...
    if vergleich.nr=eingabe.nr then
      if vergleich.pin=eingabe.pin then
        label5.caption:=(floattostr(vergleich.stand));
    read (KSK, vergleich);
  until EOF(KSK);
end;
//edit
PS: Ich persönlich schwöre Stein und Bein auf TFileStreams. Die kann ich dir ans Herz legen, sieh dir die mal an. Hat zwar nicht direkt was mit deinem Problem zu tun, aber an vielen Stellen wird dadurch IMHO das Hantieren mit Dateien viel einfacher.

saibotq 3. Dez 2005 14:33

Re: mehrere Datensätze in Datei schreiben und wieder Auslese
 
Erstmal vielen Dank für die Hilfe, trotzdem hat es irgendwie so noch nicht geklappt. Mir ist aber zum Glück eine andere Idee gekommen, ohne das ******* EOF:

Delphi-Quellcode:
seek(KSK,0);

for i:=0 to filesize(KSK)-1 do
begin
    read (KSK, vergleich);
    if vergleich.nr=eingabe.nr then
    if vergleich.pin=eingabe.pin then
    label5.caption:=(floattostr(vergleich.stand));
end;
also PROBLEM GELÖST

Hansa 3. Dez 2005 15:32

Re: mehrere Datensätze in Datei schreiben und wieder Auslese
 
Jo. Problem gelöst Patient tot ? Bei Tigerman siehts ähnlich aus. Schrecklich. :lol: Tigerman : gesehen, daß ich mit einer einzigen Zeile mit while und read an den richtigen Stellen gleich 2 deiner Abfragen auf EOF und auch noch das repeat gleich mit erschlagen habe ? Gut viele Wege führen nach Rom. Aber so was mit for zu machen, das würde ich mir erst gar nicht angewöhnen. Irgendwann kommt dann noch Break an unnötigen Stellen ins Spiel und und... Und zu guter letzt kommt der berühmte Sphagetti-Code bei dem Ganzen raus. 8)

tigerman33 3. Dez 2005 16:00

Re: mehrere Datensätze in Datei schreiben und wieder Auslese
 
Ach ja klar, ich Depp. :wall:
Aus irgendeinem Grund war ich da der Meinung, dass bei vorgestellter Prüfung das letzte read einen Fehler produzieren könnte. Das ist aber natürlich völliger Quatsch, die while-Schleife ist da eindeutig das Mittel der Wahl.

Ich schreibe fünfzigmal "Die while-Schleife funktioniert hier besser als die repeat-Schleife".

"Die while-Schleife funktioniert hier besser als die repeat-Schleife"
"Die while-Schleife funktioniert hier besser als die repeat-Schleife"
"Die while-Schleife funktioniert hier besser als die repeat-Schleife"
"Die while-Schleife funktioniert hier besser als die repeat-Schleife"
"Die while-Schleife funktioniert hier besser als die repeat-Schleife"
...

PS: Aber die erste if-Abfrage muss denke ich trotzdem sein. Es gibt doch auch leere Dateien, oder? (Sag jetzt nicht nein, sonst muss ich nochmal 50 Sätze schreiben... :lol: )

Hansa 3. Dez 2005 16:21

Re: mehrere Datensätze in Datei schreiben und wieder Auslese
 
Dierkt nach dem öffnen würde ich IOresult auf 0 prüfen. Bei <> 0 Fehlermeldung und nix mehr mit while.


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