Daten aus Datei in array speichern

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Daten aus Datei in array speichern

Beitrag von jojo1541 »

Hallo.
Wie der Titel schon sagt möchte ich aus einer zuvor mittels

Code: Alles auswählen

datei$ = OpenFileRequester()
OpenFile(#file,datei$)
geöffneten Datei Data-Blöcke auslesen und in einem zweidimensionalen Array speichern.

Hab schon ein bisschen rumprobiert aber komme auf keine Lösung.

XIncludeFile und IncludeFile gehen nicht, da sie ja feste strings voraussetzen.

Wie wären eure Ansätze für so eine Option?
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

was ist denn drin in deinem file?

wenn es eine Reihe von Longs ist, hilft dir der ReadLong Befehl, etc.

(oder soll ich deine Frage so interpretieren, dass du klarcode dateien zur laufzeit öffnen willst?)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

die Datenblöcken müssen ein klares Trennungszeichen haben:

zB:
Data1,Data2,Data3|Data4,Data5,Data6|Data7,Data8,Data9
dann kannst du ein 2D-Array so beschrieben:

Code: Alles auswählen

Dim Raster.s(2,2)
String$ = ReadString(File)
For y = 0 to 2
 Zeile$ = StringField(String$, y+1, "|")
 For x = 0 to 2
  Raster(x,y) = StringField(Zeile$, x+1, ",")
 Next
Next
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Long-Daten aus einer Datei lesen und in ein Array speichern:

Code: Alles auswählen

; Datareader

Dim Arry.l ( 9, 9 )

If ReadFile( 0, "Datablocks.dat" )
  OpenConsole()
    For n=0 To 9
      For t=0 To 9
        Arry(t,n) = ReadLong( 0 )
        Print( Str( Arry(t,n) ) + ", " )
      Next
      PrintN("")
    Next
  CloseFile( 0 )
  Input()
Else
  MessageRequester( "ERROR", "Can't read File", #MB_ICONERROR )
EndIf
Datenfile aus Data-Zeilen erzeugen:

Code: Alles auswählen

; Datacreator

If CreateFile( 0, "Datablocks.dat" )
    For n=0 To 9
      For t=0 To 9
        Read.l a.l
        WriteLong( 0, a )
      Next
    Next
  CloseFile( 0 )
Else
  MessageRequester( "ERROR", "Can't create File", #MB_ICONERROR )
EndIf

DataSection
  Data.l 10001, 10002, 10003, 10004, 10005, 10006, 10007, 10008, 10009, 10010
  Data.l 20001, 20002, 20003, 20004, 20005, 20006, 20007, 20008, 20009, 20010
  Data.l 30001, 30002, 30003, 30004, 30005, 30006, 30007, 30008, 30009, 30010
  Data.l 40001, 40002, 40003, 40004, 40005, 40006, 40007, 40008, 40009, 40010
  Data.l 50001, 50002, 50003, 50004, 50005, 50006, 50007, 50008, 50009, 50010
  Data.l 60001, 60002, 60003, 60004, 60005, 60006, 60007, 60008, 60009, 60010
  Data.l 70001, 70002, 70003, 70004, 70005, 70006, 70007, 70008, 70009, 70010
  Data.l 80001, 80002, 80003, 80004, 80005, 80006, 80007, 80008, 80009, 80010
  Data.l 90001, 90002, 90003, 90004, 90005, 90006, 90007, 90008, 90009, 90010
  Data.l 11001, 11002, 11003, 11004, 11005, 11006, 11007, 11008, 11009, 11010
EndDataSection
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

es gibt auch noch ReadData, ist nicht ganz so langsam.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

völlig richtig, ist aber wesentlich arkaner bzw. obskurer für einen Anfänger.
bei einer doppelten Schleife kann man noch "sehen", wo die größe eine Rolle spielt und wo was zusammenhängt.

hier noch das Beispiel mit ReadData, hier dient die Doppelschleife nur noch zum Anzeigen des Array-Inhalts.

Code: Alles auswählen

; Datareader2

Dim Arry.l ( 9, 9 )

If ReadFile( 0, "Datablocks.dat" )
  OpenConsole()
;*****************
    ReadData( 0, Arry(), 10 * 10 * SizeOf( Long ) )
;*****************
    For n=0 To 9
      For t=0 To 9
        Print( Str( Arry(t,n) ) + ", " )
      Next
      PrintN("")
    Next
  CloseFile( 0 )
  Input()
Else
  MessageRequester( "ERROR", "Can't create File", #MB_ICONERROR )
EndIf
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Beitrag von jojo1541 »

meine Level, die ich wieder einlesen möchte haben Datablocks mit einem Maximalwert von 40. Trotzdem bekam ich mit deinem Datarerader(habe es an meine Datei angepasst) neunstellige Werte, dass liegt höchstwahrscheinlich daran, dass mein Speicherformat Datablöcke sind, also:

Code: Alles auswählen

Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.l  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
wie kann ich das "Data.l" vorne ignorieren?
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

du musst erstmal den Datacreator benutzen, um aus deinen Klarcode-Datablöcken eine reine Datendatei zu machen.

dann bekommst du zwar auch Longs, aber eben keinen 9-stelligen Kauderwelsch,
sondern korrekte Nuller in Longs verpackt.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Beitrag von jojo1541 »

Ok, irgendwie hat mir bis jetzt nichts wirklich geholfen.
Höchstwahrscheinlich liegt es mal wieder an meiner Art und Weise, die LAge zu schildern.


ALSO:

Ich habe am anfang einen Array, in dem Daten meiner map gespeichert sind. diese Daten möchte ich in einer Datei speichern, damit man sie bei bedarf wieder öffnen und weiterbearbeiten kann.

Sprich: Ich brauche eine Lösung, daten aus einem array in eine Datei zu speichern und diese dann wieder auszulesen.

Leider hab ich keinen Plan, wie ich das bewerkstelligen soll. :cry:
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

AHA Bild

Code: Alles auswählen

#MapWidth  = 64
#MapHeight = 64

Global Dim MapArray.l( #MapWidth -1, #MapHeight -1 )

Procedure.i LoadMap( Name.s )
  If ReadFile( 0, Name )
    ReadData( 0, MapArray(), #MapWidth * #MapHeight * SizeOf( Long ) )
    CloseFile( 0 )
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure.i SaveMap( Name.s )
  If CreateFile( 0, Name )
    WriteData( 0, MapArray(), #MapWidth * #MapHeight * SizeOf( Long ) )
    CloseFile( 0 )
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure


;**
;** TestRoutine
;**

; create test values

For t=0 To #MapHeight -1
  For n=0 To #MapWidth -1
    MapArray( n, t ) = 1000 * n + t
  Next
Next

; save as map

If Not SaveMap( "Test01.map" )
  MessageRequester( "ERROR", "Can't save Map", #MB_ICONERROR ) 
  End
EndIf

; clear maparray

For t=0 To #MapHeight -1
  For n=0 To #MapWidth -1
    MapArray( n, t ) = 0
  Next
Next

; load map

If Not LoadMap( "Test01.map" )
  MessageRequester( "ERROR", "Can't load Map", #MB_ICONERROR ) 
  End
EndIf

; display arraydata

OpenConsole()
For t=0 To #MapHeight -1
  For n=0 To #MapWidth -1
    Print( Str( MapArray( n, t ) ) + ", " )
  Next
  PrintN("")
Next
Input()
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten