Seite 1 von 3

Speichern von Variablen

Verfasst: 18.04.2009 18:16
von Sauer-RAM
Hi alle zusammen,
Ich bin noch ein anfänger und möchte damit ich das programieren in purebasic besser lerne, ein Programm schreiben, indem ich Personendaten (z.B. Vorname, Nachname, Alter, Geschlecht, Größe und so weiter)
erstellen, abspeichern und dann nach bestimmten Angaben Personen suchen kann.
Also wenn ich Alter 23 und Geschlecht mänlich eingebe soll es mir alle zutreffende Personen anzeigen. Nur weis ich etwas wesentliches leider nicht: Wie speichere ich Variablen ab, so dass ich sie beim nächsten programmstart laden kann?

PS: und am besten bitte so erklären dass auch ein Anfänger wie ich das noch versteht.

Vielen Dank schonmal im voraus

Verfasst: 18.04.2009 18:29
von KeyKon
Am Einfachsten Speicherst du Variablen mit den Preference-Befehlen, aber das is für sowas wie dus mach willst evtl. schnell Unübersichtlich...
Ich denke für dich wäre folgednes am Besten:

Vereine die PersonenDaten in Arrays mit Structuren und speichere diese Arrays dann mit WriteData() ab und lade sie mit ReadData() wieder...

Die Deluxelösung wäre es das ganze in einer Datenbank anzulegen, aber ich denke das ginge zu weit^^

Verfasst: 18.04.2009 18:56
von AND51
Als Anfänger sollte man keinesfalls mit Strukturen arbeiten und Arrays mit WriteData() abspeichern.
Das ist viel zu komplex und du hast ja angesprochen, dass es auch einfachere Lösungen gibt.

Um Daten abzuspeichern, die du auch später wieder einlesen musst, brauchst du ein einheitliches Format.
Speichere wie vorgeschlagen deine Daten in Preferences-Dateien, die sind wie INI-Dateien aufgebaut.

Oder nimm (d)ein eigenes Format und speichere Alter, Name und Geschlecht, etc. mit Trennzeichen jeweils in eine Zeile in einer Datei:

Code: Alles auswählen

Ralf|23|m
Tine|43|w
Olaf|11|m

...und so weiter...
Das Trennzeichen brauchst du, damit du später einfach die Dateien wieder auseinandernehmen kannst. Das geht mit StringField().

Verfasst: 18.04.2009 21:02
von kswb73
Als Anfänger hast du zwei Möglichkeiten Variabeln zu speichern. Die erste ist die von KeyKon genannte Möglichkeit mit der Preference Libary. Preferences ist von Prinzip her ganz normale Dateien. Sie werden hauptsächlich dazu verwendet Einstellungen zu speichern, mann kann sie aber auch anderwertig einsetzten. Das Prinzip ist einfach. Jedem Wert den du abspeichern möchtest gibst du ein Schlüsselwort. Zum Beispiel "Name_1" für den ersten Namen in deiner Liste. Mittels WritePreferenceString("Name_1",Name.s) speicherst du den Namen dann ab. Später musst du nur angeben das du einen String (also einen Text) auslesen willst und das er unter dem Schlüsselwort Name_1 steht. Dies geschieht duch ReadPreferenceString("Name_1","noName"). NoName ist der sogenannte default Wert. Er wird ausgegeben wenn Name_1 nicht existiert. Du kannst leicht nachsehen ob die Datei richtig gespeichert wurde, indem du sie mit einen reinen Texteditor (also z.B. Notepad und nicht Word) öffnest. Da steht dann zum Beispiel :
Name_1=kswb73
Das heißt das dem Schlüsselwort Name_1 der Text kswb73 zugewiesen wurde. Mit Zahlen funkioniert dies genau so.

Die zweite Möglichkeit ist die von KeyKon und AND51 angesprochene FileLibary. Es handelt sich dabei um Befehle mit denen du selber festlegen kannst wie deine Dateien gespeichert werden. Sowohl beim speichern als auch beim Laden schreibst bzw. liest du jedes Stück nacheinander aus.
Du speicherst Beispiel erst die Hausnummer und dann das Alter. Das sieht dann so aus.
WriteLong(Datei,Hausnummer)
WriteLong(Datei,Alter)
Datei ist die Id der Datei, welche du bei CreateFile() angibst. Anhand dieser Id kannst du erkennen in welche Datei du gerade schreibst/liest falls du mit mehreren Dateien gleichzeitig arbeitest. Das auslesen funktioniert genau so. Du liest die Werte einfach in der Reihenfolge aus, in der du sie geschrieben hast.
Hausnummer=ReadLong(Datei)
Alter=ReadLong(Datei)
Das Kontrollieren ob die Datei richtig gespeichert wurde ist hierbei schwerer. Wenn du nur Strings speicherst kannst du sie aber trozdem mit einem reinem Texteditor ansehen. Bei WriteStringN() schreibst PureBasic ans ende eine 0 als Byte. In diesem Fall taucht bei den meisten Texteditoren ein Viereck auf.
Denk daran wenn du eine Datei geöffnet oder erstellt hast sie nach dem auslesen wieder zu schließen um Speicher zu sparen und die Datei wieder für andere Benutzer freizugeben. Selbiges gilt auch für Preferences.
Du musst bei beiden Möglichkeiten die Datei nicht unbedinngt immer gleich auslesen. Du kanst sie auch bedingt auslesen. Wenn du zumbeispiel speicherst, das vier Elemente vorhanden sind, liest du einfach vier Stück aus und lässt es dann sein.

Verfasst: 18.04.2009 22:55
von BI2
Hallo Sauer-RAM

eine relativ einfache Sache ist die Daten in einer Strukturierten Liste zu verwalten.
Schau Dir dazu in der Hilfe mal die Strukturen und die LinkedLists an.
Mit den Beispielprozeduren unten kannst Du dann ganz einfach Daten in einer Textdatei speichern und diese dann wieder einlesen.

Code: Alles auswählen

Structure Personendaten ; Struktur für Personendaten
	Name.s
	Alter.l
	Geschlecht.s
EndStructure

Global NewList Person.Personendaten() ; Globale Liste Person vom Typ Struktur Personendaten

Procedure Laden() ; Prozedur zum laden der Personendaten aus der Datei

	Protected Datei.l = ReadFile(#PB_Any, "Hier muß der Dateiname rein z.B.: c:\Personen.dat")

	If Datei

		ClearList(Person()) ; Löschen aller Elemente in der Liste...

		Repeat ; ...und anschliesendes füllen mit den Inhalten aus der Datei
			AddElement(Person())
			Person()\Name = ReadString(Datei)
			Person()\Alter = Val(ReadString(Datei)) ; Alter ist vom Typ Long - also muß der gelesene String umgewandelt werden
			Person()\Geschlecht = ReadString(Datei)
		Until Eof(Datei)

		CloseFile(Datei)

	EndIf

EndProcedure

Procedure Speichern() ; Prozedur zum laden der Personendaten aus der Datei

	;Neue Datei erstellen
	Protected Datei.l = CreateFile(#PB_Any, "Hier muß der Dateiname rein z.B.: c:\Personen.dat")

	If Datei

		ResetList(Person()) ; zum ersten Element in der Liste springen...

		While NextElement(Person()) ; ... und solange Daten vorhanden sind in die Datei schreiben
			WriteStringN(Datei, Person()\Name)
			WriteStringN(Datei, Str(Person()\Alter)) ; Alter ist vom Typ Long - muß also in einen String umgewandelt werden
			WriteStringN(Datei, Person()\Geschlecht)
		Wend

		CloseFile(Datei)

	EndIf

EndProcedure
Gruß, BI2

Verfasst: 19.04.2009 03:00
von mk-soft
Habe es mal etwas umgebaut. Somit kann die Datei auch mit Excel bearbeitet werden und wieder als *.txt mit Trennzeichen TAB gespeichert werden.

Code: Alles auswählen

Structure Personendaten ; Struktur für Personendaten
   Name.s
   Alter.l
   Geschlecht.s
EndStructure

Global NewList Person.Personendaten() ; Globale Liste Person vom Typ Struktur Personendaten

Procedure Laden() ; Prozedur zum laden der Personendaten aus der Datei

   Protected Datei.l, Dateiname.s, temp.s
   
   Dateiname = GetPathPart(ProgramFilename()) + "MeineDaten.txt"
   Datei = ReadFile(#PB_Any, Dateiname)

   If Datei

      ClearList(Person()) ; Löschen aller Elemente in der Liste...
      temp = ReadString(Datei) ; Erste zeile ignorieren
      Repeat ; ...und anschliesendes füllen mit den Inhalten aus der Datei
         AddElement(Person())
         temp = ReadString(Datei)
         Person()\Name = StringField(temp, 1, #TAB$)
         Person()\Alter = Val(StringField(temp, 2, #TAB$)) ; Alter ist vom Typ Long - also muß der gelesene String umgewandelt werden
         Person()\Geschlecht = StringField(temp, 3, #TAB$)
      Until Eof(Datei)

      CloseFile(Datei)

   EndIf

EndProcedure

Procedure Speichern() ; Prozedur zum laden der Personendaten aus der Datei

   ;Neue Datei erstellen
   Protected Datei.l, temp.s, dateiname.s
   
   Dateiname = GetPathPart(ProgramFilename()) + "MeineDaten.txt"
   Datei = CreateFile(#PB_Any, Dateiname)

   If Datei

      temp = "Name" + #TAB$ + "Alter" + #TAB$ + "Geschlecht"
      WriteStringN(datei, temp) ; Kopfzeile mit Feldnamen schreiben
      ForEach Person() ; ... und solange Daten vorhanden sind in die Datei schreiben
         temp = Person()\Name + #TAB$ + Str(Person()\Alter) + #TAB$ + Person()\Geschlecht
         WriteStringN(Datei, temp)
      Next

      CloseFile(Datei)

   EndIf

EndProcedure
FF :wink:

Verfasst: 19.04.2009 03:06
von KeyKon
Hab auch noch einen Alten Code von mir Online gestellt: http://www.purebasic.fr/german/viewtopic.php?t=19766

Verfasst: 19.04.2009 13:26
von Sauer-RAM
Vielen Dank für euere antworten.
Und noch ne frage: glaubt ihr ich kann so ein programm in 800 zeilen schreiben?
weil ich hab leider nur die demoversion :cry:

Verfasst: 19.04.2009 13:40
von php-freak
Ja das geht wohl!

Verfasst: 19.04.2009 13:40
von KeyKon
Kommt drauf an wie viel Schnick-Schnack du noch rein haben willlst, aber wenns nur darum geht was du im ersten Post beschrieben hast sollte das locker möglich sein...