Verschiedene Datentypen in Dateien speichern
-
- 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
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!
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!
Re: Verschiedene Datentypen in Dateien speichern
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
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
-
- 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
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

LG
-
- 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
Hm. Leider kommen trotz klarer Anweisung trotzdem Fehlermeldungen. Der Quelltext meines Testprogrammes lautet:
Was braucht er denn noch für Parameter? In allen Quellen ist es so angegeben, wie ich es gemacht habe...
Vielen Dank, für eure Antwort,
Liebe Grüße
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...




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
Grund: Bitte nutze den Highlighter
-
- 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
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...
end;
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]); // [color=#BF0000]nr); [/color]
[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);
Zuletzt geändert von Lori am Do 7. Feb 2013, 15:39, insgesamt 1-mal geändert.
Grund: Bitte nutze den Highlighter
Grund: Bitte nutze den Highlighter
-
- 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
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:
"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
Grund: Bitte nutze den Highlighter und editiere deine Beiträge statt dir selber zu antworten
-
- Lazarusforum e. V.
- Beiträge: 7192
- 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
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.
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
Michael Springwald
-
- 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
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...
Re: Verschiedene Datentypen in Dateien speichern
Welches zweite Problem?
-
- Lazarusforum e. V.
- Beiträge: 7192
- 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
Der Meint bestimmt, dass sein Soruce-Code nicht Formatiert ist... z.b. Leerzeichen können wahre Wunder bewirken *G*.
MFG
Michael Springwald
Michael Springwald
-
- 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
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;
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;
Re: Verschiedene Datentypen in Dateien speichern
Textfile kann man glaub ich nicht seeken. Bin aber nicht mehr fit mit diesem alten Kram. 

-
- 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
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...
Danke für den Hinweis - da wäre ich nie drauf gekommen... ich hoffte - zeilenweise die Datei auslesen zu können...
-
- Beiträge: 726
- 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
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.:theo hat geschrieben:Textfile kann man glaub ich nicht seeken. Bin aber nicht mehr fit mit diesem alten Kram.
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
-
- 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
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...

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...