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() liest 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() liest 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".