Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Versuch hinter dem Dateiende zu lesen (https://www.delphipraxis.net/33327-versuch-hinter-dem-dateiende-zu-lesen.html)

himitsu 13. Jun 2012 14:24

AW: Versuch hinter dem Dateiende zu lesen
 
Bei einer typisierten Datei-Variable gibt FileSize nicht die Dateigröße, sondern die Anzahl der Records an.
Delphi-Quellcode:
(RealSizeOfFile div RecSize)

Aphton 13. Jun 2012 15:05

AW: Versuch hinter dem Dateiende zu lesen
 
Achso, ok. Was bewirkt Seek() bei einer typisierten Datei? Springt er an die exakte Position, die angegeben wird, oder wird das intern mit der TypenGröße mültipliziert? Falls ja, dann würde das mit der For-Schleife auch funktionieren und der Fehler läge wo anders =/

DeddyH 13. Jun 2012 15:13

AW: Versuch hinter dem Dateiende zu lesen
 
Delphi-Referenz durchsuchenSystem.Seek
Zitat:

Mit Seek kann in Delphi eine geöffnete typisierte oder nichttypisierte Datei auf eine bestimmte Position gesetzt werden. Der Positionszeiger der Datei F wird auf die Komponente mit der Nummer N gesetzt. Die erste Komponente in einer Datei hat immer die Nummer 0.

p80286 14. Jun 2012 10:52

AW: Versuch hinter dem Dateiende zu lesen
 
Ich denke dies ist nicht ganz unproblematisch;
Delphi-Quellcode:
procedure TForm1.Button5Click(Sender: TObject);
var key:String[25];
i:integer;
h:integer;
begin
Assignfile(woert,'Wörterbuch.dat');
reset(woert);
.....
for i := 1 to filesize(woert) do begin
  read(woert,Woerterbuch);
  if key=Woerterbuch[i].Englisch then begin
    ...
    löschen(h);
    exit;
  end
   else
    ... end;
closefile(woert);
end;


Procedure löschen(h:integer);
...
begin
assignfile(woert,'Wörterbuch.dat');
reset(woert);
..
closefile(woert);
LÖSCHEN wir auf eine geöffnete Datei ausgeführt (übrigens ein Hoch auf globale Variablen).

Wenn schon global, dann aber reset und closefile auch global!

Gruß
K-H

RhodosGuard 14. Jun 2012 11:59

AW: Versuch hinter dem Dateiende zu lesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich weiß jetzt nicht nach wem ich mich richten soll.

Zitat:

Bei einer typisierten Datei-Variable gibt FileSize nicht die Dateigröße, sondern die Anzahl der Records an.
Also bei mir gibt Filesize im Prinzip die Anzahl der Wörter wieder die ich gespeichert habe was in meinem Fall ja auch gewollt ist

Zitat:

Falls die Datei (IMMER) aus mindestens einem Datensatz besteht, so kann man dies mit der repeat until Schleife machen.
Ansonsten nimmt man die While Do Schleife
Schon mit einer Repeat-Until schleife probiert, kein Erfolg

Zitat:

LÖSCHEN wir auf eine geöffnete Datei ausgeführt (übrigens ein Hoch auf globale Variablen).
Wenn schon global, dann aber reset und closefile auch global!
Habe das so gelernt und es ist für mich übersichtlicher wenn ich für jeden Verarbeitungsschritt meine feste Regel zum Öffnen und Schließen habe. Meinst du ich soll die Datei nicht neu öffnen und schließen? Ist das dann bei jeder "Unterprozedur" so?

Im Anhang ist dann mal meine Unit.

p80286 14. Jun 2012 12:44

AW: Versuch hinter dem Dateiende zu lesen
 
Zitat:

Zitat von RhodosGuard (Beitrag 1170824)
Habe das so gelernt und es ist für mich übersichtlicher wenn ich für jeden Verarbeitungsschritt meine feste Regel zum Öffnen und Schließen habe. Meinst du ich soll die Datei nicht neu öffnen und schließen?

Schau Dir bitte den Ablauf in den beiden Proceduren an.
Zuerst öffnest Du die Datei (assignfile+reset) dann gehst Du in einer schleife durch die Datei.
Findest Du einen zu löschenden record springst Du aus der Schleife heraus und öffnest die Datei, die immer noch offen ist erneut (assignfile+reset), das kann nicht gut gehen.
Versuch doch zumindestens folgendes:
Delphi-Quellcode:
if key=Woerterbuch[i].Englisch then begin
    ...
    closefile(woert); {------- Datei schließen!!!!!! }
    löschen(h);
    exit;
  end
Das ist zwar nicht schön, sollte aber wenigstens fehlerfrei sein.

Gruß
K-H

RhodosGuard 15. Jun 2012 08:54

AW: Versuch hinter dem Dateiende zu lesen
 
Delphi-Quellcode:
procedure TForm1.Button5Click(Sender: TObject);
var key:String[25];
i:integer;
h:integer;
begin
assignfile(woert,'Wörterbuch.dat');
Reset(woert);
key:=Inputbox('Abfrage','Welches Wort löschen?(bitte das englische Wort eingeben)','');
for i := 1 to filesize(woert) do begin
  read(woert,Woerterbuch);
  if key=Woerterbuch[i].Englisch then begin
    h:=i;
    löschen(h);
    exit;
  end;
showmessage('Das Wort steht nicht im Wörterbuch');
end;
closefile(woert);
end;

Procedure löschen(h:integer);
var m:Twoerterbuch2;
begin
Read(woert,Woerterbuch);
while h<Filesize(woert) do begin
  m[h]:=Woerterbuch[h];
  Woerterbuch[h]:=Woerterbuch[h+1];
  Woerterbuch[h+1]:=m[h];
  write(woert,Woerterbuch);
  inc(h);
end;
seek(woert,Filesize(woert)-1);
truncate(woert);
end;
SIeht mittlerweilse so aus sagt mir aber "Dateizugriff verweigert" und dannach habe ich angeblich eine Filesize von 1001 und es fehlen 2 Einträge.

p80286 15. Jun 2012 10:22

AW: Versuch hinter dem Dateiende zu lesen
 
Zitat:

Zitat von RhodosGuard (Beitrag 1171000)
SIeht mittlerweilse so aus sagt mir aber "Dateizugriff verweigert" und dannach habe ich angeblich eine Filesize von 1001 und es fehlen 2 Einträge.

und Wo sagt er das?

Delphi-Quellcode:
Procedure Loeschen(h:integer);
var
  tmpsatz : TMyWoertRec;
  maxidx : integer;
begin
  maxidx:=filesize(woert);
  repeat
    seek(woert,h+1);
    read(woert,tmpsatz);
    dec(h,1);
    seek(woert,h);
    write(woert,tmpsatz);
  until h>=maxidx;
  truncate(woert);
end;
bleibt noch das Closefile unterzubringen.

Hast Du einmal darüber nachgedacht, Deine Daten in einer TList unterzubringen?
Das wäre auf jeden Fall schneller.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:08 Uhr.
Seite 2 von 2     12   

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