Dateihandling

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
HWSCH
Beiträge: 3
Registriert: So 24. Jul 2016, 22:20

Dateihandling

Beitrag von HWSCH »

Hallo,
dies ist mein erstes posting hier. Ich bitte daher um Nachsicht, falls ich hier nicht richtig bin.

Mein Sohn (11) entwickelt Interesse am Programmieren.
Meine Programmierkenntnisse sind leider über 30Jahre alt und beschränken sich auf ein wenig Pascal und fortran und natürlcih noch das BASIC (ich glaube turbobasic)
Ich habe freepascal IDE runtergeladen und installiert.
Einfach Programme bekomme ich noch hin, aber wir wollen jetzt eine Spielesammlung programmieren, bei der die Spieler einen account ertsellen können und ihre gewonnenen oder verlorenen "Münzen" abgespeichert werden.
Mein Problem: ich bekomme das Dateihandling nicht wirklich hin.
Ein Datensatz sollte den Spielernamen, das Guthaben und die brereits freigeschalteten Spiele enthalten
also:
TYPE account: record
Spielername:String;
Münzen:Integer;
fspiel1:boolean;
fspiel2:boolean;
...
end;

var spieler: account
Spielerdatenbank: file of account;

Dazu brauche ich verschiedene Prozeduren und funktionen, denke ich mal:
function fileexists (habe ich gefunden)
procedure neueDatenbakerstellen (falls die Datenbank noch nicht exitstiert)
function SpielerIstinDatenbank:boolean
procedure SpielerinDatenbankhinzufuegen
weitere?

Ich blicke vor allem bei den verschiedenen Dateibefehlen der verschiedenen Pascal-Version nicht durch.
kann mir da jemand helfen den Überblick zu bekommen?

vielen Dank im Voraus

Hannibal

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Re: Dateihandling

Beitrag von creed steiger »

hmmm man kann es sicher "zu Fuß" machen... ich persönlich würde für so kleine Sachen ini Files nehmen

http://wiki.freepascal.org/Using_INI_Files

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Dateihandling

Beitrag von Mathias »

Das mit dem Record hast du schon mal richtig gemacht.

Das hier könnte die weiterhelfen: http://stackoverflow.com/questions/5763 ... -in-delphi

Eine Variante wäre noch TStream (ist weiter unten beschrieben), ist etwas moderner, als das normale Read und Write wie in Turbo-Pascal.

Die Ini-Datei Methode wie von creed steiger ist auch eine Lösung. Nur, das kann man gut Cheaten. :mrgreen:

Hier noch ein Link mit Read und Write: https://www.delphi-treff.de/tipps-trick ... speichern/
Bei einem String sind die [] wichtig.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

HWSCH
Beiträge: 3
Registriert: So 24. Jul 2016, 22:20

Re: Dateihandling

Beitrag von HWSCH »

Vielen Dank erstmal für die schnellen Antworten.

Ich werde versuchen mich in diesen "modernen Kram" einzulesen. Ich denke, wenn man einmal versteht wie das funktioniert, ist es wesentlich eleganter als in den "alten Zeiten" :D

aktuell habe ich folgendes Problem(neben anderen):

in unserem Programm soll, wenn keine Datenbankdatei existiert, eine neue angelegt werden.
Diese soll 2 User bereits enthalten.

wenn ich also schreibe:
rewrite(spielerdatenbank);
spieler.spielernamen:='Oberboss';
write(spielerdatenbank,spieler);
spieler.spielernamen:='unter';
write (spielerdatenbank);
close(spielerdatenbank);

dann steht in der Datei
Oberboss unteross
es sieht so aus, als würden in spieler.spielernamen nur die Zeichen überschrieben bis zum Ende des strings, die Zeichen danach bleiben von String vorher erhalten.
das war mir nicht klar. wie kann ich das verhindern?
LG
Hannibal

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Dateihandling

Beitrag von Mathias »

es sieht so aus, als würden in spieler.spielernamen nur die Zeichen überschrieben bis zum Ende des strings, die Zeichen danach bleiben von String vorher erhalten.

Wie hast du den String deklariert ?
Wie hast du spielerdatenbank deklariert ?

Bei Verwendung von klassischem strukturierten Dateien, muss der String so deklariert sein:

Code: Alles auswählen

var
  s: String // falsch
  s: String[30] // richtig
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

HWSCH
Beiträge: 3
Registriert: So 24. Jul 2016, 22:20

Re: Dateihandling

Beitrag von HWSCH »

Hatte ein paar Tage zu viel zu tun, und mein Sohn ist jetzt bei der Mutter, daher mein Schweigen hier. Sorry.

Ich habe die Stringdeklaration entsprechend geändert, aber es hat sich nichts verändert.

Ich denke, meine altertümlichen Programmierkenntnisse reichen einfach nicht aus für heutige Ansprüche.

Vielleicht ist es einfacher erstmal selber Delphi/Lazarus zu lernen. Wie mache ich das am besten?


LG
Hannibal

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Dateihandling

Beitrag von Mathias »

So sollte es mit 2 Datensätzen gehen, kann natürlich ausgebaut werden.

Code: Alles auswählen

program Project1;
 
type
  Tacount=record
    Name:String[20];
    Geld:Integer;
    spiel1:Boolean;
    spiel2:Boolean;
  end;
 
procedure Save;
var
  acount1, acount2:Tacount;
  facount:file of Tacount;
begin
  with acount1 do begin
    Name:='Hannibal';
    Geld:=1234;
    spiel1:=True;
    spiel2:=False;
  end;
  with acount2 do begin
    Name:='Lazarus';
    Geld:=43211234;
    spiel1:=True;
    spiel2:=True;
  end;
  AssignFile(facount, 'test.dat');
  Rewrite(facount);
  Write(facount, acount1);
  Write(facount, acount2);
  CloseFile(facount);
end;
 
procedure load;
var
  acount1, acount2 :Tacount;
  facount:file of Tacount;
begin
  AssignFile(facount, 'test.dat');
  Reset(facount);
  Read(facount, acount1);
  Read(facount, acount2);
  CloseFile(facount);
  with acount1 do begin
    WriteLn(Name);
    WriteLn(Geld);
    WriteLn(spiel1);
    WriteLn(spiel2);
  end;
  with acount2 do begin
    WriteLn(Name);
    WriteLn(Geld);
    WriteLn(spiel1);
    WriteLn(spiel2);
  end;
end;
 
begin
  Save;
  load;
end.
 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten