Autor Beitrag
flaming|barney
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 01.03.05 16:45 
Hi...
ich kenne mich mit dem Speichern und lesen in oder aus einer datei nicht wirklich aus.
Habe nun eine kleine datenbank geschrieben, bei der die daten auf die festplatte gespeichert werden sollen und beim start des programms sollen daten gelesen werden.

ich gebe hier vorerst nur die proceduren, die das Speichern und lesen betreffen, an:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
implementation
  var x: Integer;

  type TPerson = record
    Name: String[20];
    Vorname: String[20];
    Strasse: String[30];
    PLZ: String[10];
    Ort: String[30];
  end;

  var f: File of TPerson;
  var verz: String;
  var Buch: array[1..10of TPerson;
{$R *.dfm}

procedure datei_neu;
  begin
    {$I-} Rewrite(f); {$I+}
    if IOResult <> 0 then
    Showmessage('Fehler beim Erzeugen einer neuen Datei');
  end;

procedure datei_schreiben;
  var i: Integer;
    begin
      {$I-} Reset(f) {I+};
      if IOResult <>0 then
        Showmessage('Fehler beim Lesen');
      for i:= 1 to 10 do
        read(f, Buch[i]);
    end;

procedure datei_lesen;
  var i: Integer;
    begin
      {$I-} Reset(f) {$I+};  {wenn man an dieser Stelle das {$I+} in ein {I+} umändert, wird der fehler nicht mehr angezeigt. Allerdings erscheint nun das Fenster "Fehler beim Lesen" }
      if IOResult <> 0 then
        Showmessage('Fehler beim Lesen');
      for i:= 1 to 10 do
        read(f,Buch[i]);
    end;


procedure TForm1.DAT_LOAD(Sender: TObject);
  var i: integer;
    begin
      verz:= ExtractFilePath(ParamStr(0)) + 'personen.dat';
      AssignFile(f, verz);
      {$I-} Reset(f) {$I+};
      if IOResult <> 0 then
        begin
          i:= Application.MessageBox('Datei neu anlegen?' , ' '52);
          if i= 6 then
            datei_neu
          else
            halt;
        end
          else
            datei_lesen;
          end;


Bei dem versuch nun etwas in die neu erstellte datei zu laden (das erstellen funktioniert) wird mir nun gesagt, dass versucht wird noch hinter dem dateiende zu lesen... ?_?

Wäre super, wenn mir einer von euch weiterhelfen könnte

mfg barney

Moderiert von user profile iconAXMD: Code- durch Delphi-Tags ersetzt.


Zuletzt bearbeitet von flaming|barney am Di 01.03.05 16:54, insgesamt 1-mal bearbeitet
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Di 01.03.05 16:54 
Ist es Absicht, dass du die Datei nirgendwo schließt?

AXMD
flaming|barney Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 01.03.05 16:57 
mhh habe ich noch nicht drüber nachgedacht...
aber ich greife beim arbeiten mit dem prog in so ziemlich jedem schritt auf die datei zu.
Entweder um veränderungen zu sichern, oder um informationen über eine andere Person zu laden.

Leider verstehe ich die Algorithmen, die ich zum speichern usw. benutze nur teilwese. Wann muss ich zB beim {I+} ein "$" zeichen davorsetzen und wann nicht?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 01.03.05 16:58 
Und warum ist das
ausblenden Delphi-Quelltext
1:
var f: File of TPerson;					

global? Du solltest selbst sehen, dass man dadurch ganz schnell selber die Übersicht verliert.
flaming|barney Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 01.03.05 17:00 
weil ich zu faul bin um das bei jeder prozedur noch mal lokal zu deklarieren...
ist das für euch zu unübersichtlich? (bin chaot ;))
kann es auch nochmal ändern...

Das ist zB auch so einer von den Befehlen, die ich selber nicht verstehe.
Ich habe das prog schon einmal in der schule geschrieben und wollte es nun gerne zu Hause zum verfeinern und weiterarbeiten nochmal schreiben. Nur leider klappt es nicht -.-"
flaming|barney Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 01.03.05 17:48 
habe den fehler nun mit etwas hilfe aus dem irc gefunden.

habe in der prozedur "datei_schreiben" anstelle von

ausblenden Delphi-Quelltext
1:
2:
for i:= 1 to 10 do
  write(f, Buch[i]);


ausblenden Delphi-Quelltext
1:
2:
for i:= 1 to 10 do
  read(f, Buch[i]);


dort stehen gehabt.
Danke für eure unterstützung,

barney
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 01.03.05 21:36 
flaming|barney hat folgendes geschrieben:
weil ich zu faul bin um das bei jeder prozedur noch mal lokal zu deklarieren...

Und du meinst das rechtfertigt unsaubere Programmierung? Ich möchte dein gesicht sehen, wenn du dein auto aus der Werstatt holst und der Mechaniker zu dir sagt: "Ach was ich noch sagen wollte, ich habe die Reifen nur mit einer Mutter festgemacht, für den Rest war ich zu faul." :roll:
flaming|barney Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 01.03.05 22:29 
Dein Beispiel mag auf einiges zutreffen... aber ich glaube nicht auf diesen Fall:
Warum ist es denn hier unübersichtlich? ich habe wahrscheinlich viel zu wenig programmiererfahrung, um das beurteilen zu können. Aber ich dachte es sei vorteilhaft eine variable dann global zu deklarieren, wenn ich in mehreren Prozeduren auf sie zugreifen möchte.
Damit hier erkannt wird, wie "f" deklariert ist, habe ich ja den gesamten implementation bereich dazugeschrieben...

ps: werde mir das abgewöhnen und wieder vermehrt von lokalen variablen gebrauch machen. Bei größeren programmen als meinen muss ich recht geben: Es würde unübersichtlich werden.