Variable (Structure) abspeichern / auslesen

Anfängerfragen zum Programmieren mit PureBasic.
pureanfänger
Beiträge: 74
Registriert: 29.03.2008 15:22

Variable (Structure) abspeichern / auslesen

Beitrag 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.
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag 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.
Zuletzt geändert von Josef Sniatecki am 01.11.2008 23:11, insgesamt 1-mal geändert.
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
pureanfänger
Beiträge: 74
Registriert: 29.03.2008 15:22

Beitrag von pureanfänger »

Vielen Dank an Euch beide.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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



Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Little John

Beitrag 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
finnkerchief
Beiträge: 17
Registriert: 01.11.2008 12:48
Wohnort: Österreich

Beitrag 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
System: Win XP, SP3, PB 4.31, Pentium D 3 GHz 1 GB RAM
Little John

Beitrag 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
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag 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".
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Antworten