Seite 1 von 3

Daten aus Datei in array speichern

Verfasst: 04.04.2009 15:15
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?

Verfasst: 04.04.2009 15:18
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?)

Verfasst: 04.04.2009 15:21
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

Verfasst: 04.04.2009 15:33
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

Verfasst: 04.04.2009 15:35
von edel
es gibt auch noch ReadData, ist nicht ganz so langsam.

Verfasst: 04.04.2009 16:04
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

Verfasst: 04.04.2009 16:08
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?

Verfasst: 04.04.2009 16:31
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.

Verfasst: 04.04.2009 17:15
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:

Verfasst: 04.04.2009 17:43
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()