AGB  ·  Datenschutz  ·  Impressum  







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

Versuch hinter dem Dateiende zu lesen

Ein Thema von TheMiller · begonnen am 4. Nov 2004 · letzter Beitrag vom 15. Jun 2012
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#11

AW: Versuch hinter dem Dateiende zu lesen

  Alt 13. Jun 2012, 15:24
Bei einer typisierten Datei-Variable gibt FileSize nicht die Dateigröße, sondern die Anzahl der Records an.
(RealSizeOfFile div RecSize)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#12

AW: Versuch hinter dem Dateiende zu lesen

  Alt 13. Jun 2012, 16:05
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 =/
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#13

AW: Versuch hinter dem Dateiende zu lesen

  Alt 13. Jun 2012, 16:13
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#14

AW: Versuch hinter dem Dateiende zu lesen

  Alt 14. Jun 2012, 11:52
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
RhodosGuard

Registriert seit: 13. Jun 2012
3 Beiträge
 
#15

AW: Versuch hinter dem Dateiende zu lesen

  Alt 14. Jun 2012, 12:59
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.
Angehängte Dateien
Dateityp: pas Unit1.pas (3,5 KB, 0x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#16

AW: Versuch hinter dem Dateiende zu lesen

  Alt 14. Jun 2012, 13:44
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
RhodosGuard

Registriert seit: 13. Jun 2012
3 Beiträge
 
#17

AW: Versuch hinter dem Dateiende zu lesen

  Alt 15. Jun 2012, 09:54
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.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#18

AW: Versuch hinter dem Dateiende zu lesen

  Alt 15. Jun 2012, 11:22
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 08:11 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