Seite 1 von 1
Variable (Structure) abspeichern / auslesen
Verfasst: 01.11.2008 22:52
von pureanfänger
Hallo Leute,
ich suche eine Möglichkeit eine strukturierte Variable in einer Datei abzuspeichern und später auszulesen.
Vielen Dank für Eure Hilfe.
BSP:
CreateFile(0, "PersDaten.dat")
Structure Person
Name.s
Vorname.s
Strasse.s
PLZ.s
Ort.s
EndStructure
User.Person
User\Name = "Mustermann"
User\Vorname = "Max"
User\Strasse = "..."
User\PLZ = "12345"
User\Ort = "Bremen"
Jetzt möchte ich die Variable "User" in der Datei "PersDaten.dat" speichern und mit einem anderen Programm auslesen.
Verfasst: 01.11.2008 23:07
von Josef Sniatecki
Das ganze kannst du mit WriteData machen. Jedoch ist das auslesen der
Daten in eine Struktur wieder schreibarbeit. Außerdem musst du eine
extraschleife für das auslesen von Strings machen, da ReadString() bis
EOF und nicht NULL ließt.
EDIT: Mit Strings in Strukturen kann das problematisch werden.
Verwende einfach die Methode von ts-soft.
Verfasst: 01.11.2008 23:09
von ts-soft
Code: Alles auswählen
Structure Person
Name.s
Vorname.s
Strasse.s
PLZ.s
Ort.s
EndStructure
User.Person
User\Name = "Mustermann"
User\Vorname = "Max"
User\Strasse = "..."
User\PLZ = "12345"
User\Ort = "Bremen"
If CreateFile(0, "PersDaten.dat")
WriteStringN(0, User\Name)
WriteStringN(0, User\Vorname)
...
CloseFile(0)
EndIf
Mit ReadFile und ReadString wieder auslesen
Verfasst: 01.11.2008 23:15
von pureanfänger
Vielen Dank an Euch beide.
Verfasst: 02.11.2008 00:16
von hjbremer
Da du soetwas ähnliches wie eine Datenbank machen willst kannst du auch mit FixStrings arbeiten. Speicherplatz ist ja heutzutage kein Problem mehr.
Hier das Prinzip für Schreiben und lesen
Code: Alles auswählen
Structure Person
Name.s {30}
Vorname.s{30}
Strasse.s{30}
PLZ.s {5}
Ort.s {30}
EndStructure
Procedure SatzLesen(*Daten.Person, nr)
mem = *Daten
memlg = SizeOf(Person)
dnr = OpenFile(#PB_Any,"test.bin")
If dnr
FileSeek(dnr, nr * memlg)
ReadData(dnr, mem,memlg)
CloseFile(dnr)
EndIf
EndProcedure
Procedure SatzSchreiben(*Daten.Person)
mem = *Daten
memlg = SizeOf(Person)
;Char 0 gegen Leerzeichen austauschen
;sonst können eventuell andere Programme die Daten nicht lesen
For j = mem To mem + memlg
a = PeekB(j)
If a = 0
PokeB(j,32)
EndIf
Next
dnr = OpenFile(#PB_Any,"test.bin")
FileSeek(dnr, Lof(dnr))
WriteData(dnr, mem, memlg)
CloseFile(dnr)
EndProcedure
User.Person
User\Name = "Gustermann"
User\Vorname = "Gax"
User\Strasse = "Gusterstrasse 25"
User\PLZ = "23456"
User\Ort = "Gremen"
SatzSchreiben(User.Person)
User\Name = "Mustermann"
User\Vorname = "Max"
User\Strasse = "Musterstrasse 25"
User\PLZ = "12345"
User\Ort = "Bremen"
SatzSchreiben(User.Person)
User\Name = "Bustermann"
User\Vorname = "Bax"
User\Strasse = "Busterstrasse 25"
User\PLZ = "12345"
User\Ort = "HBremen"
SatzSchreiben(User.Person)
Load.Person
For j = 0 To 2
SatzLesen(Load.Person, j)
Debug Load\Name
Debug Load\VorName
Debug Load\Strasse
Debug Load\Plz
Debug Load\Ort
Debug ""
Next
Verfasst: 02.11.2008 01:51
von Little John
Josef Sniatecki hat geschrieben:da ReadString() bis EOF und nicht NULL ließt
Das stimmt nicht.
ReadString() lie
st bis zum Ende einer Zeile (wobei es (mindestens) CR, LF und CRLF als Zeilenumbruch interpretiert) oder bis zu einem Chr(0), je nachdem was es zuerst findet.
Gruß, Little John
Verfasst: 02.11.2008 10:19
von finnkerchief
Hi, ich verwende recht zufrieden die Methode, die TS-Soft beschrieben hat, jedoch schreibe ich die einzelnen Angeben (Name, Vorname, Strasse, etc.) in einen String mit einem Platzhalter getrennt (z.B. ";") bevor ich sie mit WriteStringN() speichere. Auslesen funktioniert dann mit Readstring() und Stringfield(). So ist die Datei etwas kompakter und ich habe immer alle Angaben in einer Zeile (finde ich persönlich übersichtlicher).
Lg
Verfasst: 02.11.2008 10:25
von Little John
Ja, das ist das so genannte CSV-Dateiformat. CSV bedeutet Comma Separated Values, aber statt des Kommas kann man natürlich auch ein anderes Trennzeichen benutzen.
Gruß, Little John
Verfasst: 02.11.2008 10:27
von Josef Sniatecki
Little John hat geschrieben:Josef Sniatecki hat geschrieben:da ReadString() bis EOF und nicht NULL ließt
Das stimmt nicht.
ReadString() lie
st bis zum Ende einer Zeile (wobei es (mindestens) CR, LF und CRLF als Zeilenumbruch interpretiert) oder bis zu einem Chr(0), je nachdem was es zuerst findet.
Gruß, Little John
Ups hab mich verschrieben ich meine eol ( end of line).
Gibt es eigentlich "eol"? Kenne nur "endl".