[C++] Bestand in Array plaatsen?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Wolfos
  • Registratie: Oktober 2010
  • Laatst online: 15:50
Okay, laat ik dat opnieuw proberen.
Wat ik dus wil is een tile engine maken, het bestand ziet er zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
10 //is de xsize in tiles
10 //is de ysize in tiles
tiles.png //is de tilesheet
00 01 01 01 01 01 01 01 01 00
00 01 01 01 01 01 01 01 01 00
00 01 01 01 01 01 01 01 01 00
00 01 01 01 01 01 01 01 01 00
00 01 01 01 01 01 01 01 01 00
00 01 01 01 01 01 01 01 01 00
00 01 01 01 01 01 01 01 01 00
00 01 01 01 01 01 01 01 01 00
00 01 01 01 01 01 01 01 01 00
00 01 01 01 01 01 01 01 01 00

Die eerste drie regels worden dus al ingelezen, de eerste twee geconverteerd naar integer.
Wat ik nou wil doen, is die laatste paar regels ook inlezen (dus met de informatie die ik in het begin van het bestand hebt) en in een Array plaatsen.

Wat ik al heb:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
bool loadMap(std::string filename){
    std::string xsizes;
    int xsize;
    std::string ysizes;
    int ysize;
    std::string tiles;
    
    std::ifstream map(filename.c_str());
    //If map opened correctly, we load everything we need and convert it to whatever we need
    if (map.is_open())
    {
        getline(map, xsizes);   
        getline(map, ysizes);
        getline(map, tiles);
        xsize = atoi(xsizes.c_str());
        ysize = atoi(ysizes.c_str());
        std::string temptiles[xsize*ysize];
        for (int i = 0; i < xsize*ysize; i++){
            getline(map,temptiles[i]);
        }
        cout << "map loaded, tilesheet:" << endl << tiles << "X:" << endl << xsize << endl << "Y:" << endl << ysize << endl << temptiles;
        map.close();
    }
    //If not, we return false (1)
    else if(!map){
        return false;
    }
    return true;
}


Dat werkt dus niet, want dan krijg ik van temptiles dit terug:
0x7fff5fbfe0d0

EDIT: dit is hopelijk ietsje nuttiger?

[ Voor 41% gewijzigd door Wolfos op 12-09-2011 21:39 ]


Acties:
  • 0 Henk 'm!

  • ed800
  • Registratie: Februari 2009
  • Laatst online: 20-07 16:47
Mods kunnen de code tags in de originele post zetten ;)

[ Voor 92% gewijzigd door Creepy op 12-09-2011 21:32 ]


Acties:
  • 0 Henk 'm!

  • Wolfos
  • Registratie: Oktober 2010
  • Laatst online: 15:50
Okay, bedankt. Die stond niet in de guide dacht ik.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Wolfos schreef op maandag 12 september 2011 @ 21:29:
Okay, bedankt. Die stond niet in de guide dacht ik.
code tags

Verder is het wel handig als je topicstart compleet is; veel mensen zullen je vorige topic niet zien of gezien hebben en nu staat de informatie dus nogal gefragmenteerd. Gelieve je topicstart dus even aan te passen naar een coherent verhaal ;) Gebruik de edit knop ( Afbeeldingslocatie: http://tweakimg.net/g/forum/images/icons/edit.gif ) daarvoor even.
Wolfos schreef op maandag 12 september 2011 @ 21:24:
Dat werkt dus niet, want dan krijg ik van temptiles dit terug:
0x7fff5fbfe0d0
Hoe moeten wij daar hout van snijden zonder a) de originele input te kennen en b) uberhaupt te weten hoe je aan dat getal komt (echo je gewoon de array ofzo :? dit lijkt mij een pointer value?) En is temptiles niet een lokale var? Weet je zeker dat je geen scope issue hebt ofzo? Je functie geeft true/false terug; hou wou je temptiles dan returnen? Daar zie ik niets van in je code?

[ Voor 43% gewijzigd door RobIII op 12-09-2011 21:55 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Nu online

Reptile209

- gers -

Als getline() inderdaad (zoals de naam suggereert) een hele regel inleest, gaat het hier natuurlijk in ieder geval mis:
C++:
18
19
20
        for (int i = 0; i < xsize*ysize; i++){ 
            getline(map,temptiles[i]); 
        } 

Je leest nu xsize*ysize = 10*10 = 100 regels in. Je wil <ysize> regels lezen, en die splitsen in <xsize> getallen en die in een array stoppen.

offtopic:
Het zal vast nog maar een opzetje zijn, maar enige error-checking bij het inlezen van x/y/titel mag ook wel, en een check op end-of-file voordat je het verwachte aantal waarden binnen hebt. :)

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • Orwell
  • Registratie: December 2009
  • Laatst online: 08-09 22:11
Je zou natuurlijk ook door middel van opgegeven aantallen bijvoorbeeld:
  • Een sscanf-string op kunnen bouwen (+ "%d " maal het aantal kolommen ofzo).
  • Met strtok(string," ") de boel op kunnen hakken.
code:
1
2
3
4
5
6
7
8
9
10
int width = 20; // neem het even als constante aan
char *pattern = new char[width*3];
pattern[0] = 0; // initialize
for(int a = 0;a < width;a++) {
    strcat(pattern,"%d");
    if(a != (width-1)) {
        strcat(pattern," ");
    }
}
/* en toen stond hier een pattern dat je kunt gebruiken */

[ Voor 90% gewijzigd door Orwell op 12-09-2011 22:17 ]


Acties:
  • 0 Henk 'm!

  • Wolfos
  • Registratie: Oktober 2010
  • Laatst online: 15:50
Het gekke is dat mijn Array sowieso al die rare string weergeeft als ik cout temptiles doe. Ook als ik even die for loop weg comment. Is er iets mis met hoe ik de Array aanmaak?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je doet letterlijk cout temptiles? Dan zou ik als ik jou was nog even een paar stappen terug doen en een lesboek/tutorial/whatever bij nemen want dan mis je een behoorlijk stuk (basis)kennis.
Wat je ziet is namelijk helemaal geen "rare string" maar een (hexadecimale representatie van een) pointer (naar de array).

[ Voor 24% gewijzigd door RobIII op 12-09-2011 22:06 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Wolfos
  • Registratie: Oktober 2010
  • Laatst online: 15:50
Ik wissel weleens tussen Flash en C++. Kan je in C++ dan geen hele Array naar de console schrijven dan?
Daarnaast doet cout << temptiles[0] hetzelfde. Zelfs als ik hem declare als:
code:
1
2
3
string temptiles[5]
temptiles[0] = 1;
cout << tempftiles[0];

Acties:
  • 0 Henk 'm!

  • Orwell
  • Registratie: December 2009
  • Laatst online: 08-09 22:11
Oh, uh, je probeert een array van strings te printen. Helaas werkt gewoon de variabele (die pointer is geworden) opgeven dus niet. Probeer eens te dereferencen en/of erdoorheen te loopen.

En uh, om die vraag over C++ te beantwoorden: ja, die array kan je schrijven, maar dat geldt alleen als ze null-terminated zijn (strings heten ze). Door andere arrays moet geloopt worden.

Je maakt met een array van strings eigenlijk een array of array of char!

Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 19-09 11:00

Ventieldopje

I'm not your pal, mate!

Nee dat gaat werken, een int in een string :+

edit: *zucht* te moe

[ Voor 56% gewijzigd door Ventieldopje op 12-09-2011 22:19 ]

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • Wolfos
  • Registratie: Oktober 2010
  • Laatst online: 15:50
Okay, dat was inderdaad het probleem. Ik kan hem nu lijn voor lijn inlezen en zo komt ie dus in de Array te staan. Hoe ga ik die nu in stukken hakken?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Wolfos schreef op maandag 12 september 2011 @ 22:09:
Ik wissel weleens tussen Flash en C++. Kan je in C++ dan geen hele Array naar de console schrijven dan?
With all due respect, maar als je denkt dat Flash (Actionscript bedoel je neem ik aan) ook maar enigszins vergelijkbaar is met C++ anders dan gelijkende syntax dan zul je nog wat meer stapjes terug moeten. Don't get me wrong, ik wil niet de lullo uithangen, maar je mist echt een flink stuk basiskennis.

[ Voor 3% gewijzigd door RobIII op 12-09-2011 22:30 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 19-09 11:00

Ventieldopje

I'm not your pal, mate!

Als er een string in je array staat die je dus lijn voor lijn uit kan lezen kun je toch de 2e stap doen en de kolommen hakken en in je array proppen?

Zoek even op google hoe je makkelijk een string kan splitsen ;)

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • Wolfos
  • Registratie: Oktober 2010
  • Laatst online: 15:50
Maar strtok gaat niet geweldig met een string, ik doe dus
code:
1
const char* a = strtok(temptiles[1].c_str()," ");

En dan krijg ik dus te horen dat ik de const char* die c_str() geeft niet naar char* kan worden gecast, terwijl ik daar helemaal niet om vraag.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
http://www.cplusplus.com/reference/clibrary/cstring/strtok/
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15:26
Je bent een aardig end op weg voor een ActionScripter :P , maar de stream kan zelf tokenizen en parsen naar int's:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
    int xsize;
    int ysize;
    std::string tiles;

    std::ifstream map( filename.c_str() );

    map >> xsize >> ysize >> tiles;

    int* temptiles = new int[ ysize * xsize ];

    for (int i = 0; i < ysize; ++i )
    {
        for( int j = 0; j < xsize; ++j )
            map >> temptiles[ i * ysize + j ];
    }
...

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Wolfos
  • Registratie: Oktober 2010
  • Laatst online: 15:50
Yes, bedankt. Daar kan ik wel mee verder.

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Even tussendoor: ik zou dus nooit strtok() gebruiken omdat die niet op alle platforms thread safe is. Verschrikkelijke bugs.... ;)

Acties:
  • 0 Henk 'm!

  • Wolfos
  • Registratie: Oktober 2010
  • Laatst online: 15:50
Nee, ik heb ook gedaan wat Farlane suggereerde. Is wel zo efficient.
Pagina: 1