AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Versuch hinter dem Dateiende zu lesen

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

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

Versuch hinter dem Dateiende zu lesen

  Alt 4. Nov 2004, 22:32
Hey, stehe auf dem Schlauch. wo ist der Fehler?

Delphi-Quellcode:
procedure TForm1.FillList;
var
  i:Integer;
begin
  for i:=0 to sizeof(datei) do begin
   Seek(datei, i);
   Read(datei, data);
   ListView1.Items.Add;
   ListView1.Items[i].Caption:=data.Name;
   with ListView1.Items[i].SubItems do begin
    Add(data.Format);
    Add(data.Sprache);
   end;
  end;
end;
Initialisiert wird so:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  AssignFile(datei, 'index.dat');
  IF FileExists('index.dat') THEN Reset(datei)
  else Rewrite(datei);

  filllist;
end;
Fehlermeldung: Versuch hinter dem Dateieinde zu lesen. Könnte ja einen try-except Block einbauen, aber das ist nicht so die feine Art...

Bitte somit jämmerlich um Hilfe!
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

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

Re: Versuch hinter dem Dateiende zu lesen

  Alt 4. Nov 2004, 22:39
Hi DJ-SPM,

der Fehler liegt eindeutig hier: for i:=0 to sizeof(datei) do begin sizeof(datei) gibt dir die Anzahl Datensätze in der Datei zurück. Nachdem die Indizierung bei 0 und nicht bei 1 beginnt, hört sie auch bei sizeof(datei)-1 auf.

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

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#3

Re: Versuch hinter dem Dateiende zu lesen

  Alt 4. Nov 2004, 22:41
Also, ich finde es cool, dass dumir heute so viel hilfst, aber sizeof(datei)-1 bringt den gleichen Fehler...
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

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

Re: Versuch hinter dem Dateiende zu lesen

  Alt 4. Nov 2004, 22:43
Hi DJ-SPM,

in welcher Zeile steht der Cursor sobald die Exception auftritt? in deinem Code sehe ich nämlich keinen weiteren Fehler.

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

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#5

Re: Versuch hinter dem Dateiende zu lesen

  Alt 4. Nov 2004, 22:46
Delphi-Quellcode:
procedure TForm1.FillList;
var
  i:Integer;
begin
  for i:=0 to sizeof(datei)-1 do begin
   Seek(datei, i);
   Read(datei, data); <---------------HIER
   ListView1.Items.Add;
   ListView1.Items[i].Caption:=data.Name;
   with ListView1.Items[i].SubItems do begin
    Add(data.Format);
    Add(data.Sprache);
   end;
  end;
end;
Hier mal mein Programmcode:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, XPMan, ComCtrls;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    GroupBox1: TGroupBox;
    XPManifest1: TXPManifest;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    GroupBox2: TGroupBox;
    BitBtn1: TBitBtn;
    Label7: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Label8: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ListView1Click(Sender: TObject);
  private
    procedure FillList;
    procedure OpenInfo;
  public
    { Public-Deklarationen }
  end;

  TMovie = record
   Name :string[150];
   Format :string[100];
   CDs :string[1];
   Ton :string[20];
   Bild :string[20];
   Sprache :string[20];
   Gernre :string[20];
   Kommentar:string[255];
  end;

var
  Form1 : TForm1;
  datei : file of TMovie;
  data : TMovie;

implementation

{$R *.dfm}

procedure TForm1.FillList;
var
  i:Integer;
begin
  for i:=0 to sizeof(datei)-1 do begin
   Seek(datei, i);
   Read(datei, data);
   ListView1.Items.Add;
   ListView1.Items[i].Caption:=data.Name;
   with ListView1.Items[i].SubItems do begin
    Add(data.Format);
    Add(data.Sprache);
   end;
  end;
end;

procedure TForm1.OpenInfo;
var
  i:Integer;
begin
  Seek(datei, ListView1.Selected.Index);
  Read(datei, data);

  Label1.Caption:=data.Name;
  Label2.Caption:=data.Format;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  AssignFile(datei, 'index.dat');
  IF FileExists('index.dat') THEN Reset(datei)
  else Rewrite(datei);

  filllist;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  data.Name:=Edit1.Text;
  data.Format:=Edit2.Text;
  data.CDs:=Edit3.Text;
  data.Gernre:=Edit4.Text;
  data.Bild:=Edit5.Text;
  data.Ton:=Edit6.Text;
  data.Sprache:=Edit7.Text;

  seek(datei, filesize(datei)-1);
  write(datei, data);

  FillList;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(sizeof(datei)-1));
end;

procedure TForm1.ListView1Click(Sender: TObject);
begin
  OpenInfo;
end;

end.
Hab es net so mit Records... Will aber lernen

EDIT: Die SizeOf(datei)-1 habe ich nach deinem Post erst eingebaut
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

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

Re: Versuch hinter dem Dateiende zu lesen

  Alt 4. Nov 2004, 22:55


Dass mir das nicht früher aufgefallen ist: sizeof(datei) gibt dir nicht die anzahl records zurück, sondern die größe der filevariable. du musst filesize(datei)-1 verwenden.

Und weil wir schon dabei sind: beim schreiben eines neuen records musst du den zeiger auf filesize(datei) setzen, sonst überschreibst du ja den letzten record.

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

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#7

Re: Versuch hinter dem Dateiende zu lesen

  Alt 4. Nov 2004, 23:49
Darf ich dich Gott nennen?!?

Mir wäre es nie aufgefallen, aber jetzt wo du es sagst.... Super! Danke
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

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

Re: Versuch hinter dem Dateiende zu lesen

  Alt 4. Nov 2004, 23: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
 
#9

AW: Versuch hinter dem Dateiende zu lesen

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

AW: Versuch hinter dem Dateiende zu lesen

  Alt 13. Jun 2012, 15: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
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 19:34 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