Speichern von Variablen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Sauer-RAM
Beiträge: 326
Registriert: 13.04.2009 16:22
Computerausstattung: Lenovo ThinkPad X230t Convertible
Wohnort: Haslach i. K.

Speichern von Variablen

Beitrag 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
"Bildung kommt vom Bildschirm und nicht vom Buch, sonst hieße es ja Buchung."
Dieter Hildebrandt
"Bildung ist Das, was übrig bleibt, wenn man alles was man in der Schule gelernt hat, vergisst. "
Albert Einstein
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag 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^^
(\/) (°,,,°) (\/)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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().
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

Beitrag 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.
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Benutzeravatar
BI2
Beiträge: 146
Registriert: 26.11.2006 19:07

Beitrag 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
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Hab auch noch einen Alten Code von mir Online gestellt: http://www.purebasic.fr/german/viewtopic.php?t=19766
(\/) (°,,,°) (\/)
Benutzeravatar
Sauer-RAM
Beiträge: 326
Registriert: 13.04.2009 16:22
Computerausstattung: Lenovo ThinkPad X230t Convertible
Wohnort: Haslach i. K.

Beitrag 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:
"Bildung kommt vom Bildschirm und nicht vom Buch, sonst hieße es ja Buchung."
Dieter Hildebrandt
"Bildung ist Das, was übrig bleibt, wenn man alles was man in der Schule gelernt hat, vergisst. "
Albert Einstein
php-freak
Beiträge: 536
Registriert: 07.02.2009 18:08

Beitrag von php-freak »

Ja das geht wohl!
PureBasic 4.30 (x86)
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag 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...
(\/) (°,,,°) (\/)
Antworten