Problem mit "ReadString" und "ReadLine".

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: Problem mit "ReadString" und "ReadLine".

BeitragSo, Okt 24, 2010 14:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich brauche mal wieder Hilfe bei einem Problem, und zwar habe ich eine Datei ("files.cfg"), sie ist wie folgt aufgebaut:

Code: [AUSKLAPPEN]
;Change at your own risk!

;cars
;File         StartPoint      CarName      MaxSpeed      Brake   MaxHealth      MaxPassengers
3dgfx_cars.ddp      car1            Sultan      220         0.5      100         5
3dgfx_cars.ddp      car2            NOVA Superstar   290         0.8      120         4
3dgfx_cars.ddp      car3            Land Ranger   180         0.4      200         2
3dgfx_cars.ddp      car4            SuperSport   260         0.7      120         2

;weapon (Type: 1 = like Shotgun, 2 = rifle, 3 = hand weapon, 4 = handgun)
;File         StartPoint      WeaponName   Ammo         Type      Price      Price2
3dgfx_weapon.ddp   weapon1         Shotgun      2         1      2500         25
3dgfx_weapon.ddp   weapon2         M4         50         2      4000         75
3dgfx_weapon.ddp   weapon3         BaseBall Bat   0         3      80         0


So, dazu habe ich jetzt ausprobiert, wie man die Einträge auslesen könnte, und bin auf die Idee gekommen, "ReadString$()" zu benutzen, da "ReadLine$()" 1. Die ganze Zeile ausliest, ich möchte aber jeden Eintrag einzeln auslesen, 2. danach eine Zeile "weiterspringt", also habe ich folgendes Programm geschrieben:

Code: [AUSKLAPPEN]
AppTitle "Files.cfg Reader" ;Apptitle setzen

Global filescfg = ReadFile("files.cfg") ;Datei für lese-zugriff öffnen

For x = 0 To 3 ;die ersten 4 Zeilen überspringen, da sie nur Kommentare sind
   
   ReadLine$(filescfg)
   
Next

Print "1. Auto: " ;Eintrag auslesen:
Print "Zu Finden in Datei '" + ReadString$(filescfg) + "' unter dem Eintrag '" + ReadString$(filescfg) + "'"
Print "Name des Autos:          '" + ReadString$(filescfg) + "'"
Print "Maximale Geschwindigkeit: " + ReadString$(filescfg)
Print "Bremse:                   " + ReadString$(filescfg)
Print "Maximale Gesundheit:      " + ReadString$(filescfg)
Print "Maximale Anzahl Personen: " + ReadString$(filescfg)

CloseFile filescfg ;datei Schließen

WaitKey() ;auf taste warten
End ;dann beenden


Dabei bekomme ich aber eine MAV, also alle "ReadString$()" in "ReadLine$()" umgeschrieben - gleiches Programm, diesmal mit ReadLine$():

Code: [AUSKLAPPEN]
AppTitle "Files.cfg Reader"

Global filescfg = ReadFile("files.cfg")

For x = 0 To 3
   
   ReadLine$(filescfg)
   
Next

Print "1. Auto: "
Print "Zu Finden in Datei '" + ReadLine$(filescfg) + "' unter dem Eintrag '" + ReadLine$(filescfg) + "'"
Print "Name des Autos:          '" + ReadLine$(filescfg) + "'"
Print "Maximale Geschwindigkeit: " + ReadLine$(filescfg)
Print "Bremse:                   " + ReadLine$(filescfg)
Print "Maximale Gesundheit:      " + ReadLine$(filescfg)
Print "Maximale Anzahl Personen: " + ReadLine$(filescfg)

CloseFile filescfg

WaitKey()
End


Leider ist die Ausgabe - wie zu erwarten - Nach "Zu finden in Datei" die erste Line der Datei ("3dgfx_cars.ddp car1 Sultan 220 0.5 100 5"), usw.

kann mir iwer helfen?

thx schonmal im vorraus,
mfg,
SirMO
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Mr.Hyde

Newsposter

BeitragSo, Okt 24, 2010 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde an deiner Stelle bei Readline bleiben und den String den du bekommst dann aufteilen, d.h. du gehst den String immer so lange durch, bis ein Leerzeichen kommt. Auf den ersten Blick sieht es so aus, als wären die Informationen durch Leerzeichen voneinander getrennt. Anschließend suchst du den String weiter durch, bis kein Leerzeichen mehr kommst, und merkst dir diese Position und kannst so den nächsten Wert auslesen.
Befehle die du dafür brauchst:
Mid
Len
Asc

Diese Liste könnte dir eventuell noch weiterhelfen: https://www.blitzforum.de/help/?subcat=21
BBP News RSS | Chaos Interactive | Watanien 2 Screens, Infos und Download | Watanien 2 Worklog | PuzzleMasters
http://abgeordnetenwatch.de - http://www.regierungs-beratung.de - Der Regierung auf die Finger schauen
 

CO2

ehemals "SirMO"

BeitragSo, Okt 24, 2010 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Alles klar, besten Dank, werde es gleich ausprobieren.

Allerdings sind es keine Leerzeichen, sondern Tabs, hoffe, dass das nicht ein neues Problem darstellt...
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Mr.Hyde

Newsposter

BeitragSo, Okt 24, 2010 14:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Nö ist kein Problem, dann brauchst du stattdessen nur den ASCII-Wert für Tab statt Leerzeichen und der ist 09.
BBP News RSS | Chaos Interactive | Watanien 2 Screens, Infos und Download | Watanien 2 Worklog | PuzzleMasters
http://abgeordnetenwatch.de - http://www.regierungs-beratung.de - Der Regierung auf die Finger schauen
 

CO2

ehemals "SirMO"

BeitragSo, Okt 24, 2010 15:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, habe das Programm jetzt Umgeschrieben:

files.cfg:
Code: [AUSKLAPPEN]
;Change at your own risk!

;cars
;File,StartPoint,CarName,MaxSpeed,Brake,MaxHealth,MaxPassengers
3dgfx_cars.ddp,car1,Sultan,220,0.5,100,5
3dgfx_cars.ddp,car2,NOVA_Superstar,290,0.8,120,4
3dgfx_cars.ddp,car3,Land_Ranger,180,0.4,200,2
3dgfx_cars.ddp,car4,SuperSport,260,0.7,120,2

;weapon (Type: 1 = like Shotgun, 2 = rifle, 3 = hand weapon, 4 = handgun)
;File,StartPoint,WeaponName,Ammo,Type,Price,Price2
3dgfx_weapon.ddp,weapon1,Shotgun,2,1,2500,25
3dgfx_weapon.ddp,weapon2,M4,50,2,4000,75
3dgfx_weapon.ddp,weapon3,BaseBall_Bat,0,3,80,0
3dgfx_weapon.ddp,weapon4,Rocket_Launcher,7,4,9500,250


Programm:
Code: [AUSKLAPPEN]
Graphics 1024, 768, 32, 3

Type car
   
   Field file$
   Field eintrag$
   Field name$
   Field maxspeed
   Field brake
   Field maxhealth
   Field maxpassengers
   
End Type

Type weapon
   
   Field file$
   Field eintrag$
   Field name$
   Field munition
   Field typ
   Field price
   Field ammoprice
   
End Type

AppTitle "Files.cfg Reader"

Global filescfg = ReadFile("files.cfg")

For x = 0 To 3
   
   ReadLine$(filescfg)
   
Next

;--Zeilen auslesen

Global Zeile$ = ReadLine$(filescfg)

Global Pos = 1

Global car1.car = New car

car1\file$ = Mid$(Zeile$, Pos, Instr(Zeile$, ",", Pos))

Pos = Pos + Len(car1\file$)

car1\eintrag$ = Mid$(Zeile$, Pos, Instr(Zeile$, ",", Pos))

Pos = Pos + Len(car1\eintrag$)

car1\name$ = Mid$(Zeile$, Pos, Instr(Zeile$, ",", Pos))

Pos = Pos + Len(car1\name$)

car1\maxspeed = Mid$(Zeile$, Pos, Instr(Zeile$, ",", Pos))

Pos = Pos + Len(car1\maxspeed)

car1\brake = Mid$(Zeile$, Pos, Instr(Zeile$, ",", Pos))

Pos = Pos + Len(car1\brake)

car1\maxhealth = Mid$(Zeile$, Pos, Instr(Zeile$, ",", Pos))

Pos = Pos + Len(car1\brake)

car1\maxpassengers = Mid$(Zeile$, Pos, Instr(Zeile$, ",", Pos))

;--Zeilen ausgelesen

Print "1. Auto: "
Print "Zu Finden in Datei '" + car1\file$ + "' unter dem Eintrag '" + car1\eintrag$ + "'"
Print "Name des Autos:          '" + car1\name$ + "'"
Print "Maximale Geschwindigkeit: " + car1\maxspeed
Print "Bremse:                   " + car1\brake
Print "Maximale Gesundheit:      " + car1\maxhealth
Print "Maximale Anzahl Personen: " + car1\maxpassengers

CloseFile filescfg

WaitKey()
End


Leider immernoch das selber problem wie oben.
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
 

Toasty

BeitragSo, Okt 24, 2010 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Also bei Mid() würde ich es ja so machen: (klappt eigentlich auch)
BlitzBasic: [AUSKLAPPEN]
;...
car1\file$=Mid(Zeile$,Pos+1,Instr(Zeile$,",",Pos)-Pos-1)
;2.Parameter(Beginn): Ab Pos+1 setzen, damit das Komma nicht mit in den String kommt
;3.Parameter(Länge): Position von dem nächsten Komma ab Pos-die Position, also Pos-1 (-1 damit das nächste Komma nicht mit in den String kommt


Ist zwar etwas umständlich und unübersichtlich, aber so wird es auch in den Beispielen gemacht Smile

Gruß
Toast -das Brot.
@AMD Phenom BE X4 2,5Ghz(Overclocked 2,61Ghz); 4GB DDR2; 512MB nVidia GeForce 8400gs; Win7 Home Premium 64bit
Lua for President!
 

CO2

ehemals "SirMO"

BeitragSo, Okt 24, 2010 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal vielen Dank Toasty, aber leider bekomme ich dann folgenden Fehler:

"Parameter must be greater than 0"
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
 

CO2

ehemals "SirMO"

BeitragMo, Okt 25, 2010 15:46
Antworten mit Zitat
Benutzer-Profile anzeigen
So, ich habe mir jetzt was anderes überlegt, und zwar z.b.: heißt die erste Linie, die die Zeile ausließt wie folgt:

Code: [AUSKLAPPEN]
car1\file$ = Mid$(Zeile$, Pos, Instr(Zeile$, "  ", Pos))


Anscheinend gibt aber das "Len()" eine 1 zurückt, da nur ein einziger Buchstabe ausgegeben wird...
Kann mir jmd helfen? - Was ist an der Zeile falsch?

(Die files.cfg hat sich natürlich auch geändert: Alle Kommata wurden durch doppelleerzeichen ersetzt)

thx schonmal im vorraus,
mfg
SirMO

(PS.: Sry wegen Doppelpost, aber ansonsten wird ja nicht angezeigt, dass sich was geändert hat Wink )
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

faeX

BeitragMo, Okt 25, 2010 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
DebugLog und Print sind dein Freund. Lasse dir öfter mal deine Teilstrings ausgeben, dann findest du den Fehler leichter.

Wenn du den Teil VOR dem nächsten Komma im String haben möchtest:
BlitzBasic: [AUSKLAPPEN]
Left(sZeile, Instr(sZeile, ",") - 1)


Wen du den Teil NACH dem nächsten Komma im String haben möchtest:
BlitzBasic: [AUSKLAPPEN]
Right(sZeile, Len(sZeile) - Instr(sZeile, ","))


Jetzt kannst du dir Schrittweise deine Eigenschaften aus dem String holen,
und dann anschließend die Variable, die die Zeile enthält mit dem Teil NACH dem Komma ersetzen.
So arbeitest du den String Schritt für Schritt ab. Wink
 

CO2

ehemals "SirMO"

BeitragDi, Okt 26, 2010 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist ja, dass er das Doppelleerzeichen nach "car1" nicht findet Sad dann zieht sich der fehler natürlich weiter durchs programm...

Am besten schicke ich mal den Code, den ich gerade gebastelt habe:

Code: [AUSKLAPPEN]
Graphics 1024, 768, 32, 3 ;Grafiken setzen

Type car
   
   Field file$
   Field eintrag$
   Field name$
   Field maxspeed
   Field accrelation#
   Field brake#
   Field maxhealth
   Field maxpassengers
   
End Type

Type weapon
   
   Field file$
   Field eintrag$
   Field name$
   Field munition
   Field typ
   Field price
   Field ammoprice
   
End Type

AppTitle "Files.cfg Reader"

Global filescfg = ReadFile("files.cfg") ;files.cfg lesen

For x = 0 To 3 ;ersten 4 zeilen überspringen, da kommentare
   
   ReadLine$(filescfg)
   
Next

;--Zeilen auslesen (wird hinterher in eine For/Next Schlefe eingepackt)

Global Zeile$ = ReadLine$(filescfg) ;eine Zeile auslesen

Global Pos = 0 ;Startposition = 0

Global AnzZeichen = 0 ;Anzahl zeichen (wird später durch Len() erstetzt)

Global car1.car = New car ;Neue Instanz vom Typ "car" erstellen

car1\file$ = Left$(Zeile$, Instr(Zeile$, "  ")) ;file auslesen (Bis hierher klappt alles, außer die Formfehler (leerzeichen nach string))

Pos = Pos + Len(car1\file$) ;position um die Länge des vorherigen Strings vergrößern

Print "Länge des Strings: " + Len(car1\file)
Print "Variable Pos erhöht sich somit auf: " + Pos ;TESTAUSGABEN

car1\eintrag$ = Mid$(Zeile$, (Len(car1\file$) + 2), Instr(Zeile, "  ", Len(car1\file))) ;Auf position springen und weiterlesen (Hier beginnen die Fehler)

AnzZeichen = Len(car1\eintrag$) ;usw., usw...

Pos = Pos + AnzZeichen

Print "Länge des Strings: " + Len(car1\eintrag)
Print "Variable Pos erhöht sich somit auf: " + Pos

car1\name$ = Mid$(Zeile$, Pos, Instr(Zeile$, "  ", Pos))

AnzZeichen = Len(car1\name$)

Pos = Pos + AnzZeichen

car1\maxspeed = Mid$(Zeile$, Pos, Instr(Zeile$, "  ", Pos))

AnzZeichen = Len(car1\maxspeed)

Pos = Pos + AnzZeichen

car1\brake = Mid$(Zeile$, Pos, Instr(Zeile$, "  ", Pos))

AnzZeichen = Len(car1\brake)

Pos = Pos + AnzZeichen

car1\maxhealth = Mid$(Zeile$, Pos, Instr(Zeile$, "  ", Pos))

AnzZeichen = Len(car1\maxhealth)

Pos = Pos + AnzZeichen

car1\maxpassengers = Mid$(Zeile$, Pos, Instr(Zeile$, "  ", Pos))

;--Zeilen ausgelesen

Print "1. Auto: " ;Danach alles in Lesbarer Form ausgeben:
Print "Zu Finden in Datei '" + car1\file$ + "' unter dem Eintrag '" + car1\eintrag$ + "'"
Print "Name des Autos:          '" + car1\name$ + "'"
Print "Maximale Geschwindigkeit: " + car1\maxspeed
Print "Bremse:                   " + car1\brake
Print "Maximale Gesundheit:      " + car1\maxhealth
Print "Maximale Anzahl Personen: " + car1\maxpassengers

CloseFile filescfg ;Datei wieder schließen

WaitKey()
End ;AUS


Dann schicke ich euch auch mal die files.cfg:

Code: [AUSKLAPPEN]
;Change at your own risk!

;cars
;File  StartPoint  CarName  MaxSpeed  Accrelation  Brake  MaxHealth  MaxPassengers
3dgfx.ddp  car1  Sultan  220  0.075  0.5  100  5
3dgfx.ddp  car2  NOVA_Superstar  290  0.1  0.8  120  4
3dgfx.ddp  car3  Land_Ranger  180  0.04  0.4  200  2
3dgfx.ddp  car4  SuperSport  260  0.09  0.7  120  2

;weapon (Type: 1 = like Shotgun, 2 = rifle, 3 = hand weapon, 4 = handgun, 5 = Pistol)
;File  StartPoint  WeaponName  Ammo  Type  Price  Price2
3dgfx.ddp  weapon1  Shotgun  2  1  2500  25
3dgfx.ddp  weapon2  M4  50  2  4000  75
3dgfx.ddp  weapon3  BaseBall_Bat  0  3  80  0
3dgfx.ddp  weapon4  Rocket_Launcher  7  4  9500  250
3dgfx.ddp  weapon5  Knife  0  3  50  0
3dgfx.ddp  weapon6  UZI  30  2  2500  50
3dgfx.ddp  weapon7  Pistol  9  5  900  15
3dgfx.ddp  weapon8  AK47  45  2  3750  60
3dgfx.ddp  weapon9  Desert_Eagle  9  5  1250  80

;playermodel
;File  StartPoint
3dgfx.ddp  pm1
3dgfx.ddp  pm2
3dgfx.ddp  pm3
3dgfx.ddp  pm4


Irgendwo muss der Fehler im obigen Code sein (Ich denke ich habe einfach eine FUnktion falsch benutzt), sollte jmd den Fehler sehen, bitte sagen,

mfG,
SirMO
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group