Toon posts:

[c++] probleem met inlezen string

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een probleem met het inlezen van een string, heb al veel variaties op de code geprobeerd maar om de een of andere reden werkt het niet goed.

De string (uit een text bestand) die ik wil inlezen is de volgende:
model { /* name = */ "_area0" /* numSurfaces = */ 3

Als eerste wordt deze string ingelezen in CurrentLine, een char array van 1024 chars. Het gaat mij met name om het laatste nummer, 3.
Als ik dit nummer probeer te kopieren naar een int gaat het mis, ik gebruik daarvoor de volgende code:

sscanf(CurrentLine, "model { /* name = */ \"%s\" /* numSurfaces = */ %d", &procmodel.Name, &procmodel.NumOfSurfaces);

Nu bevat procmodel.Name wel de juiste char string, maar procmodel.NumOfSurfaces blijft gewoon 0 :?

Heeft iemand een idee hoe ik dit op kan lossen?

  • corani
  • Registratie: December 2000
  • Laatst online: 05-10-2017

corani

__,,,_(^_^)_,,,__

Is het niet iets heel doms als een \n aan het eind van je string ofzo?

Laat me nou toch eens met rust man!
Iedereen die in telekinese gelooft, steek a.u.b. mijn hand op


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22-08 01:56
Nu overschat je de mogelijkheden van sscanf nogal. Het is geen (reguliere expressie) parser! Weliswaar zal scanf de letterlijke karakters in je format string matchen (mits ze zo letterlijk voorkomen in de invoer) maar een constructie als "ABC%sDEF" is onmogelijk aangezien die DEF gewoon nog bij de string horen. Als de string omsloten wordt met whitespace zou het wel weer redelijk moeten werken, zoiets dus:
C:
1
sscanf(line, "model { /* name = */ %s /* numSurfaces = */ %d", ... );

Maar in dit geval staan de quotes ook nog in de string (en die moet je er dus zelf vanaf halen). De vraag is echter of het gebruik van sscanf ueberhaupt wel verstandig is, aangezien ik aanneem dat je bestand niet gegarandeerd aan deze stricte formattering voldoet (ik kan me voorstellen dat whitespace bijvoorbeeld optioneel is en dan werkt het al niet meer).

Raadpleeg ook de documentatie van sscanf. Als je begrijpt waarom sscanf je probleem niet oplost, kun je misschien gaan nadenken over hoe je je probleem wel op moet lossen. Als je een context-vrije definitie van je invoer kunt geven, kun je een standaard parser framework gebruiken (gebruik bijvoorbeeld Spirit). Desnoods kun je zelf iets schrijven, maar dat is veel werk en lastig om helemaal bugvrij te krijgen.

[ Voor 22% gewijzigd door Soultaker op 15-07-2003 23:53 ]


Verwijderd

Topicstarter
Bedankt voor het advies Soultaker.
Door het gebruik van sscanf zoals jij aangeeft werkt het wel, ik kan nu de string (inclusief de quotes) en de int inlezen. Ik ben inderdaad bezig om zelf een parser te schrijven, het wordt een parser voor Doom III level files zodat ik deze kan renderen in mijn engine.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Veel plezier met de manier waarop je het nu doet, maar je begrijpt natuurlijk wel dat zodra ergens een spatie anders staat, of iets dergelijks, jouw parser (als je het al een parser kunt noemen) het meteen al niet meer accepteert, terwijl het wel nog gewoon een valide Doom III level blijft.

Je kunt je beeter eens verdiepen in parser opbouw. Je zou zelfs met weinig moeite een parser kunnen bouwen mbv flex en bison

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Ja, maar de spaties staat steeds allemaal op dezelfde plaats. De file wordt namelijk gegenereerd door een level builder en die gebruikt altijd dezelfde lay-out.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Maar of het nou zo netjes is om het zo hardcoded te doen...

En sowieso, met een parser generator heb je een dergelijke parser zo gemaakt, half dagje werk ofzo (ik spreek uit ervaring)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Killemov
  • Registratie: Januari 2000
  • Laatst online: 17-08 12:12

Killemov

Ik zoek nog een mooi icooi =)

Goed, ga dan OF XML-en OF streams gebruiken OF investeer (nogal) wat tijd in Lex en Yacc. (of Flex en Bison) Lexen en Yaccen is even doorbijten, maar dan heb je ook echt een zeer krachtige tool.

Hey ... maar dan heb je ook wat!


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Goed, ga dan OF XML-en OF streams gebruiken
euh? Hij moet een bestaand formaat uitlezen. Andere technieken van opslag gebruiken is dan ook niet aan de orde

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Bedankt voor al jullie adviezen, maar dit is echt de makkelijkste manier om een file loader te maken. Het bestand is eigenlijk niet meer dan een systematisch gerangschikte verzameling van vertices (groepen cijfers om in te lezen). Ik heb al veel sources van fileloaders voor soortgelijke bestanden gezien en die gebruiken bijna allemaal deze manier.
Pagina: 1