Speichern von Variablen
- Sauer-RAM
- Beiträge: 326
- Registriert: 13.04.2009 16:22
- Computerausstattung: Lenovo ThinkPad X230t Convertible
- Wohnort: Haslach i. K.
Speichern von Variablen
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
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
Dieter Hildebrandt
"Bildung ist Das, was übrig bleibt, wenn man alles was man in der Schule gelernt hat, vergisst. "
Albert Einstein
- 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:
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^^
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^^
(\/) (°,,,°) (\/)
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:Das Trennzeichen brauchst du, damit du später einfach die Dateien wieder auseinandernehmen kannst. Das geht mit StringField().
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...
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
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.
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
Open Suse 11.2: PB 4.4
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.
Gruß, BI2
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
Habe es mal etwas umgebaut. Somit kann die Datei auch mit Excel bearbeitet werden und wieder als *.txt mit Trennzeichen TAB gespeichert werden.
FF 
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

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
- 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:
Hab auch noch einen Alten Code von mir Online gestellt: http://www.purebasic.fr/german/viewtopic.php?t=19766
(\/) (°,,,°) (\/)
- Sauer-RAM
- Beiträge: 326
- Registriert: 13.04.2009 16:22
- Computerausstattung: Lenovo ThinkPad X230t Convertible
- Wohnort: Haslach i. K.
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
Und noch ne frage: glaubt ihr ich kann so ein programm in 800 zeilen schreiben?
weil ich hab leider nur die demoversion

"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
Dieter Hildebrandt
"Bildung ist Das, was übrig bleibt, wenn man alles was man in der Schule gelernt hat, vergisst. "
Albert Einstein