AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

liste in datei specihern

Ein Thema von -most- · begonnen am 14. Dez 2006 · letzter Beitrag vom 8. Mär 2007
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: liste in datei specihern

  Alt 18. Jan 2007, 09:01
Ok, wir versuchen es mal ohne irgendwelche Stringlisten, Objekte oder Datenbanken, sondern (wie früher ) 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:
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;
Soweit dazu. Und wie du jetzt prinzipiell mit Listen arbeitest, weist du ja, schreib ich jetzt nicht extra auf.
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:
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;
Du kannst auch nur einzelne Datensätze ändern. Mit "seek" kannst du auf den entsprechenden Datensatz springen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
-most-

Registriert seit: 14. Dez 2006
Ort: Magdeburg
9 Beiträge
 
#12

Re: liste in datei specihern

  Alt 18. Jan 2007, 11:06
vielen vielen dank an euch bedie! das hat mir jetzt wirklich geholfen, denk ma den rest schaff ich alleine.
super!
Ich hupe also bin ich!
  Mit Zitat antworten Zitat
-most-

Registriert seit: 14. Dez 2006
Ort: Magdeburg
9 Beiträge
 
#13

Re: liste in datei specihern

  Alt 25. Jan 2007, 07:37
Was genau muss hier bei den pünktchen noch hinzugefügt werden? und was ist dieses "tmp"

Delphi-Quellcode:
var Datei:file of TDatensatz;
    item,tmp:PItem;
    //...
und wasgenau ist hier zu beachten?
Delphi-Quellcode:
item:=start;
  while item<>nil do begin
    start:=start^.next;
     write(Datei,item^.Artikel);
    item:=item^.next;
  end;
reicht das so? oder wie in etwa muss diese schleife aussehen?


danke wa
Ich hupe also bin ich!
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#14

Re: liste in datei specihern

  Alt 25. Jan 2007, 08:02
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)

Delphi-Quellcode:
Const
   MaxArtikel = 100000;

type
   TWarenhaus = Record
                  ArtikelNr : String[40];
                  //...
                end;
Var
   Waren : Array[0..MaxArtikel] of TWarenhaus;
Frank
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#15

Re: liste in datei specihern

  Alt 25. Jan 2007, 09:49
Zitat von -most-:
Was genau muss hier bei den pünktchen noch hinzugefügt werden? und was ist dieses "tmp"
Delphi-Quellcode:
var Datei:file of TDatensatz;
    item,tmp:PItem;
    //...
Bei den Pünktchen...? Hmm, anscheinend nix mehr, ausser du brauchst zum Löschen noch ein paar Variablen.

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 von -most-:
und wasgenau ist hier zu beachten?
Delphi-Quellcode:
item:=start;
  while item<>nil do begin
    //start:=start^.next; rausnehmen
     write(Datei,item^.Artikel);
    item:=item^.next;
  end;
reicht das so? oder wie in etwa muss diese schleife aussehen?
Ich glaube ich hatte schon alles geschrieben, macnhmal bedeuten Kommentare bei mir auch, dass ich schon alles gemacht habe. Aber wenn du etwas an deinem Datensatz änderst, dann musst du auch da etwas ändern.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
-most-

Registriert seit: 14. Dez 2006
Ort: Magdeburg
9 Beiträge
 
#16

Re: liste in datei specihern

  Alt 22. Feb 2007, 06:56
Zitat:
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)


1
·
·
·
5
·
·
·
·
10
Const
MaxArtikel = 100000;

type
TWarenhaus = Record
ArtikelNr : String[40];
//...
end;
Var
Waren : Array[0..MaxArtikel] of TWarenhaus;



Frank



das ist ja schön und gut aber was hilft mir das jetzt???

übrigens danke sirius
Ich hupe also bin ich!
  Mit Zitat antworten Zitat
-most-

Registriert seit: 14. Dez 2006
Ort: Magdeburg
9 Beiträge
 
#17

Re: liste in datei specihern

  Alt 8. Mär 2007, 07:46
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

danke schonma im voraus
Ich hupe also bin ich!
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#18

Re: liste in datei specihern

  Alt 8. Mär 2007, 08:08
Na das ist ja schön und gut. Ich würde gern mal auf die schnelle Millionär werden

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?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz