Problem beim Auslesen einer .txt Datei

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Vindur

Betreff: Problem beim Auslesen einer .txt Datei

BeitragSa, Dez 06, 2008 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Nabend,
Wie erwähnt plagt mich das Auslesen von Dateien. (Ich nahm einfach mal .txt) Ich wollte irgendwie herausfinden, wie BladeRunner in seinem Spiel "MiniHack" die Karten ausliest, in denen ja nur Zahlen stehen.
Also hab ich mir eine .txt Datei erstellt und einen Code zum auslesen geschriebe, welcher jedoch fehlerhaft ist. Nun weiss ich nicht was genau der Fehler ist und wie ich ihn beheben kann.

Der Inhalt der .txt Datei ist folgender:
Code: [AUSKLAPPEN]

010101
121212
232323
343434
454545
565656


Und der Code dieser:
Code: [AUSKLAPPEN]

Dim map(6,6)

filein = ReadFile("Karte.txt")

      For x = 0 To 5
       For y = 0 To 5
         map(x,y) = ReadInt(filein)
       Next
      Next   

Print map(x,y)

WaitKey()   
CloseFile filein


Hoffe mir kann dabei jemand helfen.

The_Nici

BeitragSa, Dez 06, 2008 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Auch mit WriteInt reingeschrieben?
 

gigi

BeitragSa, Dez 06, 2008 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du den Inhalt der .txt Datei genauso kopiert?
Denn dann sollte es mich nicht wundern das es nicht klappt,normal sieht der Inhalt einer solchen Datei eher so aus
Code: [AUSKLAPPEN]

   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3
   3

Anfänger Tut von mir:
http://www.blitzforum.de/forum...hp?t=26185
 

Vindur

BeitragSa, Dez 06, 2008 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
@The_Nici

Nein. Das möchte ich ja umgehen, weil es kein Sinn macht im selben Code eine map zu schreiben und auszulesen, da ich ihn dann auch gleich direkt von Hand setzen kann. Hab es jedoch vorher schonmal mit WriteInt versucht, aber hab es wohl falsch angewendet.

@gigi

Normalerweise schon, aber bei den Karten von BladeRunner stehen auch ganz normale Zahlen ohne Punkt und Komma in der Datei.(Welche jedoch eine .map war)
 

gigi

BeitragSa, Dez 06, 2008 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Das seine Dateien .map heißen tut nichts zur Sache.
Ich frage mich wie er das sonst gelöst hat? Frag ihn doch mal!

GIGI
Anfänger Tut von mir:
http://www.blitzforum.de/forum...hp?t=26185

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Dez 06, 2008 21:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Integer besteht aus 4 Bytes. Deine Zahlen dagegen bestehen aus 6 Bytes in erweiterten ASCII-Zeichensatz. Du mußt dich also entscheiden ob du die Zahlen mit WriteInt da rein schreibst und auch so wieder ausliesst. Wobei sie dann nicht vom Texteditor bearbeitet werden können. Oder die Zeilen mit ReadLine einliesst und dann die einzelnen Strings in echte Zahlen umwandelst.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Xeres

Moderator

BeitragSa, Dez 06, 2008 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
In der Textdatei befindet sich... Text! Auch wenn Ziffern darin stehen, sind es immer noch Strings. Du ließt die Zahlen als Text ein und wandelst das passende Stück in eine Zahl um:
Code: [AUSKLAPPEN]
Local txt$="100"
Local i = Int(Left(txt$, 2))
Print i
WaitKey()


Edit
Code korrigiert... wo hab ich bloß den Kopf...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Vindur

BeitragSa, Dez 06, 2008 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay danke^^. Die Zahlen werden angezeigt, aber ein neues Problem tritt auf. Und zwar bin ich nicht sicher, wie ich auf die einzelnen Zahlen zugreifen kann bzw. sie einem Bild als Frame zuzuordne.

BladeRunner

Moderator

BeitragSa, Dez 06, 2008 22:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe ganz schnöde und profan mit readline gearbeitet, und dann mittels der Stringbefehle (vor allem mid ) die einzelnen Buchstaben aus den Zeilen ausgelesen. Keine grosse Magie.
Der Unterschied ist wie schon erwähnt dass readint wirklich den direkten Zahlenwert speichert, was für Menschen oft nicht lesbar ist. Strings sind leichter zu lesen, aber oft verschwenderischer was den Platz angeht.
Ich hoffe das half.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

TimBo

BeitragSa, Dez 06, 2008 22:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

habe auch den Fehler gemacht und habe so Daten in einen Editor geschrieben.
Wenn es eine Map ist, die eh nicht verändert werden soll, dann lass dir von einem Programm die Datei schreiben.

schau dir also die Befehle Openfile
WriteInt WriteByte ReadInt und WriteInt
das ist viel einfacher.

Die Daten können aber nur mit Write und ReadBefehlen verändert werden.
Um an einen Ort der Datei zu gelangen schau dir SeekFile an.

Viele Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.
 

Vindur

BeitragSa, Dez 06, 2008 22:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke BladeRunner. Mit dem Mid Befehl habe ich nun rumgespielt und konnte somit die Zeichen pro Zeile steuern. Wenn ich aber einen Delay einbaue, muss ich feststellen, dass immer Zeile für Zeile dargestellt wird. Und wenn ich zusätzlich Len verwende zeigt er mir lediglich die Anzahl an Zeichen pro Zeile an. Hilfreich war es aber trotzdem, muss jetzt nur etwas am code fummeln und dann wird das schon. Very Happy

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Dez 06, 2008 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin grad in so einer Laune, dass ich Kurzprogramme schreibe. Hier mal ein kleiner Editor der sowohl laden als auch speichern kann. Mit dem Mausrad lassen sich die Werte pro Tile ändern. Über die erste Konstante kann man auch die Mapauflösung angeben.

Code: [AUSKLAPPEN]
Graphics 512,512,0,2
SetBuffer BackBuffer()

Const Tiles%=4 ;Hier die lineare Anzahl Tiles angeben
Const Datei$="c:\blub.dat" ;Hier den Datennamen eintragen

Const TileSize#=512.0/Tiles
Dim Map(Tiles-1,Tiles-1)

Local Timer%=CreateTimer(50)
Local MX%,MY%,MW%
Local X%,Y%
Local File%




While Not KeyHit(1)
   MX=Floor(MouseX()/TileSize)
   MY=Floor(MouseY()/TileSize)
   MW=MouseZSpeed()
   
   For Y=0 To Tiles-1
      For X=0 To Tiles-1
         Color 120,120,120: Rect X*TileSize,Y*TileSize,TileSize,TileSize,0
         Color 240,240,120: Text X*TileSize,Y*TileSize,Map(X,Y)
      Next
   Next
   
   Color 255,255,255: Rect MX*TileSize,MY*TileSize,TileSize,TileSize,0
   
   Map(MX,MY)=Map(MX,MY)-MW
   If Map(MX,MY)>255 Then Map(MX,MY)=255
   If Map(MX,MY)<0 Then Map(MX,MY)=0
   
   
   
   
   ;[F1]LOAD
   If KeyHit(59) Then
      If FileType(Datei)<>1 Then RuntimeError "Datei gibt es noch garnicht!"
      File=ReadFile(Datei)
      For Y=0 To Tiles-1
         For X=0 To Tiles-1
            Map(X,Y)=ReadByte(File)
         Next
      Next
      CloseFile File
      Print "GELADEN"
      Delay 1000
   End If
   
   ;[F2]SAVE
   If KeyHit(60) Then
      File=WriteFile(Datei)
      For Y=0 To Tiles-1
         For X=0 To Tiles-1
            WriteByte(File,Map(X,Y))
         Next
      Next
      CloseFile File
      Print "GESPEICHERT"
      Delay 1000
   End If
   
   WaitTimer Timer
   Flip 0
   Cls
Wend
End


Nur um zu zeigen, dass ein Notepad-rumgefuchtel im grunde keinen Sinn ergibt, wenn man eh mit Dateien rumhantieren will.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Vindur

BeitragSa, Dez 06, 2008 22:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank hectic!
Ich denke mal ich werde maps solange mit einem Editor erstellen bis mir mal ein Geistesblitz kommt.^^
Aber in einem Editor scheint es anschaulicher zu sein als in einer Textdatei.
Nochmals vielen Dank an alle. Very Happy

TimBo

BeitragSa, Dez 06, 2008 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
ja. Das ist der eine Vorteil eines Mapeditors.

Denn was ist wenn du später CollisionLines ; Verschiedene Tile reaktionen etc mit in die Datei speichern willst.

Dann wird es arg strange mit dem Win NotePad.
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

BladeRunner

Moderator

BeitragSa, Dez 06, 2008 22:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hectic hat auch selbstredend vollkommen recht. Bei minihack wurde v.a. deshalb kein Editor benutzt weil es ja ein ungeplantes Experiment war, um mit Reflection rumzuspielen. Ich hätte ehrlich gesagt anfangs nicht erwartet dass es mal solche Dimensionen annimmt.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Vindur

BeitragSo, Dez 07, 2008 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist leider beim Auslesen der durch den Editor erstellten Datei ein Problem aufgetreten. Und da ich deswegen nicht gleich einen neuen Thread öffnen möchte, schildere ich es hier.
Alsoooo...Es wird alles korrekt geladen und angezeigt.Nun habe ich den Zahlwerten einen Colorbefehl zugewiesen der sich auf das zu zeichnende Rect auswirkt. Auch das klappt wunderbar. Jedoch tritt nach einiger Zeit ein Error auf, welcher da besagt "Stream does not exist!" und im Debugger wird die Zeile "Map(x,y) = ReadByte(File)" markiert. Warum tritt nach einigen Durchläufen der selben Operation plötzlich ein Fehler auf? Und warum erkennt das Programm die Datei nichtmehr?

Der Code lautet wie folgt:
Code: [AUSKLAPPEN]

Graphics 640,480,32,0
SetBuffer BackBuffer()

Const tiles% = 10
Const tilesize = 10
Const Datei$="Karte.map"
Dim Map(Tiles-1,Tiles-1)
Global px,py
timer = CreateTimer(50)


While Not KeyHit(1)
WaitTimer(timer)

load()
move()

Color 255,255,255
Text px,py,"X"


Flip:Cls
Wend
End





Function load()
File=ReadFile(Datei)
   For Y=0 To tiles-1
      For X=0 To tiles-1
         Map(X,Y)=ReadByte(File)
         Color map(x,y)*50,map(x,y)*50,map(x,y)*50
         Rect x*TileSize,y*TileSize,TileSize,TileSize
      Next
   Next   
End Function




Function move()
If KeyHit(205)
      px = px + TileSize
   ElseIf KeyHit(203)
      px = px - TileSize
   ElseIf KeyHit(200)
      py = py - TileSize
   ElseIf KeyHit(208)
      py = py + TileSize
EndIf
End Function

ozzi789

BeitragSo, Dez 07, 2008 16:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke es liest eine Zeile aus die es gar nicht mehr gibt.
Also sind es zu wenig zeilen in der txt datei oder du liest zu viele raus.
Hoffe es ist verständlich.
(vlt hilft dir der Befehl EOF)

Bitte verbessert mich wenn ich müll laber Confused
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

Vindur

BeitragSo, Dez 07, 2008 17:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Habs vorher bereits mit Eof versucht und auch einmal mit SeekFile, aber der Fehler bleibt.
EDIT: Wenn ich EoF oder SeekFile nutze wird der Fehler bereits dort angezeigt. Ich habe das Gefühl, dass er die Datei schlichtweg nichtmehr findet oder ignoriert, weil er sie ja ständig öffnet. O.o
EDIT2: Ich glaube es hat sich erledigt. Habe hinter die For-Next Schleife den Closefile Befehl angefügt und nun scheint der Fehler nichtmehr aufzutreten. Kann es denn wirklich sein, dass die Datei ignoriert wurde??

ozzi789

BeitragSo, Dez 07, 2008 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja das kann sein wen die Datei 29438 mal offen ist das die Datei nicht mehr verfügbar ist Wink
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Xeres

Moderator

BeitragSo, Dez 07, 2008 18:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Man Lädt auch grundsätzlich nichts innerhalb der Hauptschleife...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group