Verschiedene Datentypen in Dateien speichern

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Entertainmentberg
Beiträge: 46
Registriert: So 27. Jan 2013, 22:56
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Verschiedene Datentypen in Dateien speichern

Beitrag von Entertainmentberg »

Hallo ihr alle,
ich finde nirgens eine Anleitung dazu, wie man Daten abspeichert und aufruft, während das Programm läuft. Mit String hab ich das schon hingekriegt, aber mit einem eigenen ARRAY- oder RECORD-Typen finde ich keine Lösung (Ich habe mich bisher damit beholfen, ein Codierungssystem zu entwickeln, sodass die Daten in eine txt-Datei als String gespeichert werden und beim Abrufen wieder den eigentlichen Typen zugeordnet werden - aber da gibt es doch sicherlich bessere Lösungen - oder??? Ich hoffe das...).

Liebe Grüße und vielen Dank für Antworten!

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Verschiedene Datentypen in Dateien speichern

Beitrag von theo »

Alte Schule hier: http://pascal-programming.info/lesson11.php#5

Ich nehme meistens einen TFileStream, und schreibe die einzelnen Daten raus mit FS.WriteDWord, FS.WriteAnsiString etc.

http://www.freepascal.org/docs-html/rtl ... tream.html
http://www.freepascal.org/docs-html/rtl ... tream.html

Entertainmentberg
Beiträge: 46
Registriert: So 27. Jan 2013, 22:56
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Verschiedene Datentypen in Dateien speichern

Beitrag von Entertainmentberg »

Vielen, lieben Dank! Das klingt echt vielversprechend, ich probiere das gleich mal aus. Hatte mal vor Jahren versucht (als ich von Pascal nach Delphi umgestiegen bin) mit der Pascalsprache zu arbeiten - aber das hatte nicht funktioniert. Mal sehen, was nun passiert :-)

LG

Entertainmentberg
Beiträge: 46
Registriert: So 27. Jan 2013, 22:56
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Verschiedene Datentypen in Dateien speichern

Beitrag von Entertainmentberg »

Hm. Leider kommen trotz klarer Anweisung trotzdem Fehlermeldungen. Der Quelltext meines Testprogrammes lautet:

Code: Alles auswählen

CONST
  nr_max = 6;
 
[color=#008000]TYPE[/color]
  t_person = RECORD
    namen:STRING [30];
    alter:1..110;
    Bezieh:BOOLEAN;
    Wohn:STRING [30];
    einkommen:INTEGER;
    END;
 
  t_dat = ARRAY[1..nr_max] OF t_person;
 
VAR
  nr:1..nr_max;
 
  v_person:t_person;
  file_pers: FILE OF t_person;
 
 
procedure TForm1.b_registClick(Sender: TObject);
begin
     v_person.alter:=StrToInt(e_alter.Text);
     IF e_bezieh.Text='0' THEN
        v_person.Bezieh:=FALSE ELSE
        v_person.Bezieh:=TRUE;
     v_person.namen:=e_name.Text;
     v_person.einkommen:=StrToInt(e_einkommen.Text);
     v_person.Wohn:=e_wohn.Text;
 
     ASSIGN(file_pers,'leute.txt');// Unit1.pas(94,35) Error: Wrong number of parameters specified for call to "Assign"
     REWRITE(file_pers);
     WRITE(file_pers,v_person);
     [color=#BF0000]CLOSE(file_pers);[/color]   [color=#000080]// Unit1.pas(97,22) Error: Wrong number of parameters specified for call to "Close"[/color]
 
end;
 
 
[color=#008000]procedure TForm1.b_zeigenClick(Sender: TObject);[/color]
begin
  RESET (file_pers);
  SEEK  (file_pers, StrToInt(e_nr_zeigen.Text)-1);
  READ  (file_pers,v_person);
  e_name.Text:=v_person.namen;
  e_alter.Text:=IntToStr(v_person.alter);
  e_bezieh.Text:='';
  e_wohn.Text:=v_person.Wohn;
  e_einkommen.Text:=IntToStr(v_person.einkommen);
end;
 
end.







Was braucht er denn noch für Parameter? In allen Quellen ist es so angegeben, wie ich es gemacht habe... :( :( :( :x

Vielen Dank, für eure Antwort,
Liebe Grüße
Zuletzt geändert von Lori am Do 7. Feb 2013, 15:38, insgesamt 1-mal geändert.
Grund: Bitte nutze den Highlighter

Entertainmentberg
Beiträge: 46
Registriert: So 27. Jan 2013, 22:56
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Verschiedene Datentypen in Dateien speichern

Beitrag von Entertainmentberg »

Hm. Habe etwas weiter recherchiert und experimentiert - leider erfolglos. Im folgenden Quelltext ist wohl auch etwas falsch... aber warum??? Ich halte mich doch genau an die Vorgaben... Wenn man mir beim oben genannten Fall weiterhelfen könnte, wäre ich sehr erleichtert. Dieser Fall hier ist nicht so wichtig, aber trotzdem demotivierend...


Code: Alles auswählen

[color=#008000]var[/color] 
    Datei: TextFile;
    nr : INTEGER;
 
 
[color=#008000]procedure TForm1.b_name_savClick(Sender: TObject);[/color]
begin
  nr:=0;
  AssignFile(Datei,'neu.txt');
  Rewrite(Datei);
  writeln(Datei,e_name.Text);
  CloseFile(Datei);
end;
 
[color=#008000]procedure TForm1.b_dazuClick(Sender: TObject);[/color]
begin
  INC(nr);
  AssignFile(Datei,'neu.txt');
  RESET(datei);
  Seek(datei,[color=#FF8000] FileSize(datei)-1[/color]);    // nr);      
       [color=#FF8000]//  Unit1.pas(52,28) Error: Incompatible type for arg no. 1: Got "Text", expected "AnsiString"[/color]
       [color=#BF0000]//  Unit1.pas(52,17) Error: Call by var for arg no. 1 has to match exactly: Got "Constant String" expected "File"[/color]
  writeln(Datei,e_name.Text);
  CloseFile(Datei);


end;
Zuletzt geändert von Lori am Do 7. Feb 2013, 15:39, insgesamt 1-mal geändert.
Grund: Bitte nutze den Highlighter

Entertainmentberg
Beiträge: 46
Registriert: So 27. Jan 2013, 22:56
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Verschiedene Datentypen in Dateien speichern

Beitrag von Entertainmentberg »

Ich habe einen Kumpel, der ist allwissend! Der kann kein Stück Pascal - hat aber nach 3min Recherche das Problem gelöst! Ich bin Baff!

"also ich habe in einem Forum gefunden man solle statt assign und close die methoden AssignFile() und CloseFile() verwenden
es gibt nämlcih wohl zwei unterschiedliche mehtoden assign - einmal eine systemeigene und einmal eine in den compiler eingebaute.. und da kommt es anscheinend manchmal zu zuständigkeitsunverträglichkeiten :)"

Danke! Es funktioniert! Nun sieht der Quelltext so aus:




Code: Alles auswählen

[color=#008000]TYPE[/color]
 
  t_person = RECORD
    namen:STRING [30];
    alter:1..110;
    Bezieh:BOOLEAN;
    Wohn:STRING [30];
    einkommen:INTEGER;
    END;
 
 
 
 
[color=#008000]var[/color]
  nr:1..nr_max;
 
  v_person:t_person;
  file_pers: FILE OF t_person;
 
  arr_pers:t_dat;
  file_arr:  FILE OF t_dat;
 
 
[color=#008000]procedure TForm1.b_startClick(Sender: TObject);[/color]
begin
  nr:=0;
  b_start.Visible:=false;
     ASSIGNfile(file_pers,'leute.dat')// AssignFile(Datei,'neu.txt');
     REWRITE(file_pers);
     CLOSEFile(file_pers);
end;
 
[color=#008000]procedure TForm1.b_zeigenClick(Sender: TObject);[/color]
begin
  [color=#0040FF]RESET (file_pers);
  SEEK  (file_pers, StrToInt(e_nr_zeigen.Text)-1);
  READ  (file_pers,v_person);[/color]
  e_name.Text:=v_person.namen;
  e_alter.Text:=IntToStr(v_person.alter);
  e_bezieh.Text:='';
  e_wohn.Text:=v_person.Wohn;
  e_einkommen.Text:=IntToStr(v_person.einkommen);
     [color=#0040BF]CLOSEFile(file_pers);[/color]
end;
 
[color=#008000]procedure TForm1.b_registClick(Sender: TObject);[/color]
begin
     v_person.alter:=StrToInt(e_alter.Text);
     IF e_bezieh.Text='0' THEN
        v_person.Bezieh:=FALSE ELSE
        v_person.Bezieh:=TRUE;
     v_person.namen:=e_name.Text;
     v_person.einkommen:=StrToInt(e_einkommen.Text);
     v_person.Wohn:=e_wohn.Text;
 
  [color=#0040FF]RESET (file_pers);
  SEEK  (file_pers, nr);
     WRITE(file_pers,v_person);
     CLOSEFile(file_pers);[/color]
     INC (nr);
end;
Zuletzt geändert von Lori am Do 7. Feb 2013, 15:39, insgesamt 1-mal geändert.
Grund: Bitte nutze den Highlighter und editiere deine Beiträge statt dir selber zu antworten

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Verschiedene Datentypen in Dateien speichern

Beitrag von pluto »

Schön das es jetzt geht, ein kleiner Hinweis: Es gibt hier ein Tag um Code besonders hervorzuheben. In dem Feld, wo du schreibst, gibt es eine Zeile, mit Buttons, da steht Highlighter. Dort das Entsprechende Auswählen und schon wird der Code schön angezeigt.

Das Problem ist zwar gelöst, aber vielleicht Hilft es dennoch:
http://delphi-treff.de/tutorials/datenspeicherung/

Dort steht eine Menge zu Datenspeicherung. Zwar für Delphi, aber in vielen Fällen geht es auf dieser Ebene sogar 1:1 auf Lazarus.
MFG
Michael Springwald

Entertainmentberg
Beiträge: 46
Registriert: So 27. Jan 2013, 22:56
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Verschiedene Datentypen in Dateien speichern

Beitrag von Entertainmentberg »

Oh - danke - für beides. Das zweite Problem hab ich aber noch leider nicht lösen können... hat da jemand den Fehler gefunden? Ich glaube alles korrekt gemacht zu haben...

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Verschiedene Datentypen in Dateien speichern

Beitrag von theo »

Welches zweite Problem?

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Verschiedene Datentypen in Dateien speichern

Beitrag von pluto »

Der Meint bestimmt, dass sein Soruce-Code nicht Formatiert ist... z.b. Leerzeichen können wahre Wunder bewirken *G*.
MFG
Michael Springwald

Entertainmentberg
Beiträge: 46
Registriert: So 27. Jan 2013, 22:56
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Verschiedene Datentypen in Dateien speichern

Beitrag von Entertainmentberg »

Ich meine, dass folgende Zeile nicht gehen:




Schreib ich sie so, kommt ne Fehlermeldung:
Seek(datei, FileSize(datei)-1);
// Unit1.pas(52,28) Error: Incompatible type for arg no. 1: Got "Text", expected "AnsiString"




Und so kommt auch ne Fehlermeldung... :(
Seek(datei, nr);
// Unit1.pas(52,17) Error: Call by var for arg no. 1 has to match exactly: Got "Constant String" expected "File"



Dabei ist doch
VAR Datei: TextFile;

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Verschiedene Datentypen in Dateien speichern

Beitrag von theo »

Textfile kann man glaub ich nicht seeken. Bin aber nicht mehr fit mit diesem alten Kram. ;-)

Entertainmentberg
Beiträge: 46
Registriert: So 27. Jan 2013, 22:56
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Verschiedene Datentypen in Dateien speichern

Beitrag von Entertainmentberg »

Achso? Das wär ne Erklärung... oje - wie nimmt man denn ne Textvariable nach Zeilein auseinander...
Danke für den Hinweis - da wäre ich nie drauf gekommen... ich hoffte - zeilenweise die Datei auslesen zu können...

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Verschiedene Datentypen in Dateien speichern

Beitrag von Soner »

theo hat geschrieben:Textfile kann man glaub ich nicht seeken. Bin aber nicht mehr fit mit diesem alten Kram. ;-)

Stimmt, man kann bei Textfiles keine Seek-Prozedur benutzen. Textfiles liest man mit readln Zeile für Zeile aus. Für Seek muss es typisierte Dateien sein z.b.:
var
datei: File of Byte;
datei: File of Char;
datei: File of Integer;
datei: File of String[10]; //zehn zeichen lang
datei: File of String; //geht nicht weil Länge unbekannt

Entertainmentberg
Beiträge: 46
Registriert: So 27. Jan 2013, 22:56
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Verschiedene Datentypen in Dateien speichern

Beitrag von Entertainmentberg »

Mit READLN und WRITELN! :-) Danke (-:

Ihr seid klasse! Langsam tauen die Erinnerungen kleckerweise auf!!!! Als ich das damals mit Pascal gemacht habe hab ich ja auch immer mit diesen Befehlen hantiert (-:

Erinnerung kann schön sein...

Antworten