Problem mit "ReadString" und "ReadLine".
Übersicht

CO2ehemals "SirMO"Betreff: Problem mit "ReadString" und "ReadLine". |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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.HydeNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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.HydeNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also bei Mid() würde ich es ja so machen: (klappt eigentlich auch)
BlitzBasic: [AUSKLAPPEN] ;... Ist zwar etwas umständlich und unübersichtlich, aber so wird es auch in den Beispielen gemacht ![]() 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! |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
DebugLog![]() ![]() 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. ![]() |
||
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das Problem ist ja, dass er das Doppelleerzeichen nach "car1" nicht findet ![]() 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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group