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
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#1

Re: Versuch hinter dem Dateiende zu lesen

  Alt 4. Nov 2004, 22:50
[OT]
Zitat von DJ-SPM:
Darf ich dich Gott nennen?!?
Ja, warum nicht?
[/OT]

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
RhodosGuard

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

AW: Versuch hinter dem Dateiende zu lesen

  Alt 13. Jun 2012, 09:10
Habe denselben Fehler und Blicke grad net was da falsch ist

Ist mein projekt für Informatik und nunja ich verzweifel da dran.

Mein Problem ist, dass das Programm entweder das Wort nicht bis ans Ende kopiert, oder ich den Datei-Fehler erhalte.
Setze ich bei der Procedure löschen Filesize(woert)-2 ein kopiert mir es das nicht auf den letzten Platz, wenn ich Filesize(woert)-1 eingebe bekomme ich '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
   else
    showmessage('Das Wort steht nicht im Wörterbuch');
  end;
closefile(woert);
end;


Procedure löschen(h:integer);
var m,Prüfung:Twoerterbuch2;
j:integer;
Warnung:String[1];
begin
assignfile(woert,'Wörterbuch.dat');
reset(woert);
for j := h to Filesize(woert)-1 do begin
  Read(woert,Woerterbuch);
  m[j]:=Woerterbuch[j];
  Woerterbuch[j]:=Woerterbuch[j+1];
  Woerterbuch[j+1]:=m[j];
  write(woert,Woerterbuch);
end;
seek(woert,(Filesize(woert))-1);
truncate(woert);
closefile(woert);
end;
Ich blick es nicht ....
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

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

AW: Versuch hinter dem Dateiende zu lesen

  Alt 13. Jun 2012, 14:09
Ich glaube da ist selbst FileSize() in Verbindung mit der For-Schleife nicht optimal (außer wenn [in seinem Fall] data nur 1 Byte groß ist)

per EOF(Datei) kannst du gucken, ob das Ende erreicht wurde. Da man die Anzahl der Lesebefehle nicht kennt, verwendet man nicht die inidizerte Schleife (for i) sondern eine
"einfachere". 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

Beispielcodefetzen:

Delphi-Quellcode:
  AssignFile(MeineDatei, DateiName);
  {$I-}
  Reset(MeineDatei);
  {$I+}
  if IOResult <> NO_ERROR then // Datei existiert nicht, neu anlegen // NO_ERROR = 0
    ReWrite(MeineDatei);

  while not EOF(MeineDatei) do
  begin
    Read(MeineDatei, DatenSatz);
    FügeDatenSatzInZbListe(DatenSatz);
  end;
Im obrigen Beispiel ist die Position vom FilePointer auf 0 (beim Öffnen einer Datei immer 0); falls die Datei jedoch offen war und Dateioperationen durchgeführt wurden, muss dies nicht der Fall sein, deshalb eignet sich ein Seek(MeineDatei, 0) eventuell.
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Versuch hinter dem Dateiende zu lesen

  Alt 13. Jun 2012, 14:24
Bei einer typisierten Datei-Variable gibt FileSize nicht die Dateigröße, sondern die Anzahl der Records an.
(RealSizeOfFile div RecSize)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

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

AW: Versuch hinter dem Dateiende zu lesen

  Alt 13. Jun 2012, 15: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.666 Beiträge
 
Delphi 12 Athens
 
#6

AW: Versuch hinter dem Dateiende zu lesen

  Alt 13. Jun 2012, 15: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
 
#7

AW: Versuch hinter dem Dateiende zu lesen

  Alt 14. Jun 2012, 10: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
Antwort Antwort


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 16:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz