![]() |
Re: liste in datei specihern
Ok, wir versuchen es mal ohne irgendwelche Stringlisten, Objekte oder Datenbanken, sondern (wie früher :feuerchen: ) mit einer verketteten Liste und typisierten Dateien.
Dazu brauchst du zwei Funktionen/Prozeduren, eine um den gesamten Speicherinhalt mit einen Schwunf auf die Platte zuschreiben und eine für Platte-->Speicher. Das dürfte mit deinen vorkenntnissen das einfachste sein. Code sagt manchmal mehr als tausend Worte: So stell ich mir das vor: TypenDefinition:
Delphi-Quellcode:
Soweit dazu. Und wie du jetzt prinzipiell mit Listen arbeitest, weist du ja, schreib ich jetzt nicht extra auf.
type TDatensatz={packed} record
Art_Nr:integer; //Hier alle Variablen für einen Artikel definieren end; //jetzt deine Liste (wie auch immer du die gerne machst) type PItem=^TItem TItem=record next,prior:PItem; Artikel:TDatensatz; end; Das "packed" vor dem "record", kannst du auskommentieren, dadurch wird der benötigte Speicherplatz nachher auf der Platte etwas geringer, mit dem Nachteil, dass das Programm länger braucht. Allerdings wird beides bei dem zu erwartenden Programmeinsatz nicht bemerkbar sein -->deswegen ist es egal Jetzt zum Speichern. eine typisierte Datei wird mit "file of [typ]" definiert und dann kannst du diesen Typ dort beliebig rein schreiben und lesen (günstigerweise nehmen wir als Typ useren record:
Delphi-Quellcode:
Du kannst auch nur einzelne Datensätze ändern. Mit "seek" kannst du auf den entsprechenden Datensatz springen.
procedure alles_speichern;
var Datei:file of TDatensatz; item:PItem; //... begin assignfile(Datei,'test.dat'); //Den Dateinamen kannst du natürlich auch vorher noch abfrage´n, oder sonstwo ablegen (mit Pfadangabe) rewrite(Datei); //hier wird die Datei neu erstellt, eine bereits vorhanden Date wird zuvor gelöscht item:=start; //start ist anfang der Liste while item<>nil do begin //hier musst du jetzt mit einer Schleife durch alle datensätze gehen //speichern tust du mit write(Datei,item^.Artikel); item:=item^.next; end; closefile(Datei); //schließen end; procedure alles_einlesen var Datei:file of TDatensatz; item,tmp:PItem; //... begin //hier Liste löschen assignfile(Datei,'test.dat'); if fileexists('test.dat') then begin reset(Datei); //hier wird die Datei geöffnet start:=nil; item:=nil; while not eof(Datei) do begin //eof=end of file new(tmp); read(Datei,tmp^.Artikel); //einlesen //Liste vervollständigen if start=nil then start:=tmp; if item=nil then begin item:=tmp; item^.prior:=nil; item^.next:=nil; end else begin item^.next:=tmp; tmp.^prior:=item; item:=tmp; end; end; closefile(Datei); //schließen end else //Datei existiert nicht end; |
Re: liste in datei specihern
vielen vielen dank an euch bedie! das hat mir jetzt wirklich geholfen, denk ma den rest schaff ich alleine.
super! |
Re: liste in datei specihern
Was genau muss hier bei den pünktchen noch hinzugefügt werden? und was ist dieses "tmp"
Delphi-Quellcode:
und wasgenau ist hier zu beachten?
var Datei:file of TDatensatz;
item,tmp:PItem; //...
Delphi-Quellcode:
reicht das so? oder wie in etwa muss diese schleife aussehen?
item:=start;
while item<>nil do begin start:=start^.next; write(Datei,item^.Artikel); item:=item^.next; end; danke wa |
Re: liste in datei specihern
Hallo!
Ich kann mich noch gut an meinen Informatik Unterricht erinnern. Es werden immer Programme geschrieben die an den Haaren herbeigezogen werden... Geht es bei Deinem Programm und die Listenverkettung oder um die Datei? Eine Struktur Deiner Größe musste früher auf dem Heap abgelegt werden, da im Datensegment nie genug Platz war. Außerdem war der Heap früher defragmentiert und hatte ggf. nicht genug Platz um die Daten linear zu speichern. Heute sieht es eher so aus...(Schlampigerweise) :oops:
Delphi-Quellcode:
Frank :coder:
Const
MaxArtikel = 100000; type TWarenhaus = Record ArtikelNr : String[40]; //... end; Var Waren : Array[0..MaxArtikel] of TWarenhaus; |
Re: liste in datei specihern
Zitat:
Und wozu ich tmp brauche. Um mir mal kurz ne Addresse zu merken. Ok, ein bischen ausführlicher zu Adressen/Zeigern/Pointern: tmp hab ich angelegt, weil ich es nachher brauche. item und tmp sind ja "nur" Zeiger. Belegen jeweils 4 Bytes auf dem Stack und zeigen irgendwohin in den Hauptspeicher. Und wenn wir alles richtig gemacht haben (mit der Zuweisung etc.) zeigen sie auf unseren Record. Was macht der Compiler da nun genau? (Wir vernachlässigen mal das es virtuelle und reale Adressräume gibt, das ist jetzt nicht so wichtig und würde nur verwirren) Nehmen wir an item zeigt auf eine Speicheradresse mit der Nummer 10. Dann steht genau die 10 in item drin (item = 10). Wenn ich aber den Inhalt von item haben will, dann ist mir die 10 relativ wurscht/schnuppe/egal. Deswegen mach ich da so ein Zeichen (^) drann. Das sagt dem Compiler ich will den Inhalt an Stelle 10 im Hauptspeicher haben (item^ = unser TItem). Das ist allerdings ein record und da gehts noch ein bisschen weiter. Ich möchte nämliche item^.next; Für Delphi heisst es ich will die Zahl (die ist auch wieder ein Zeiger immer 4 Bytes groß) an Stelle 10+0 im Hauptspeicher. Das "+0" Kommt daher, da "next" das erste Element ist. ein Zweites element im Record würde an Stelle 10+4 liegen (4 Bytes wegen dem next) usw... Wenn ich jetzt tmp:=item mache. Dann schreibt er die Adresse 10 in die Variable tmp rein. Jetzt zeigen also tmp und item auf die selbe Stelle im Speicher. tmp=item=10. Ich kann also jetzt mit tmp^.next genau dieselbe Zahl lesen wie mit item^.next. Und wenn ich in z.b. item^.next:=211 ändere (was mit pointer allerdings nicht so einfach geht), ist diese Zahl auch genauso in tmp^.art_nr=211. die beiden Zeiger (tmp und item) zeigen ja auf dieselbe Addresse. So ist das mit Zeigern. Und mit new(item) bekomme ich vom Speichermanager so eine frei Addresse. Mit dispose sage ich, dass ich die Addresse 10 (und die nachfolgenden n Bytes) nicht mehr brauche. Zitat:
|
Re: liste in datei specihern
Zitat:
:-D das ist ja schön und gut aber was hilft mir das jetzt??? :shock: übrigens danke sirius |
Re: liste in datei specihern
so ich geb auf. ich habs jetzt ewigkeiten versucht (auch mit hilfe diverser tutorials) und bekomms einfach nicht hin. Wär jemand von euch evt. so nett mir des programm komplett zu schreiben? würd mich auch (soweit das im internet möglich ist) auch irgendwie erkenntlich zeigen. im endeffekt gehts hier nämlich um meine abi-note :wall:
danke schonma im voraus |
Re: liste in datei specihern
Na das ist ja schön und gut. Ich würde gern mal auf die schnelle Millionär werden :mrgreen:
Aber denkst du nicht auch, dass die Abi-Note deine Leistung wiederspiegeln soll. Und wenn du auf das Programm halt keine 15 Punkte bekommst, sondern nur 10 (je nachdem wie weit du gekommen bist), dann sollte das doch in Ordnung sein. Im übrigen haben wir doch verschiedene (teils vollständige) Lösungsvorschläge zu deiner frage gepostet. Was sollen wir denn noch machen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz