Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Ongelma ifstreamin kanssa

vehkis91 [15.10.2009 11:27:50]

#

Eli olis vähän ongelmaa ifstreamin kanssa, ongelma selitetty koodin kommentiss.

Pari päivää oon miettinyt erinlaisia ratkasuja, mut mitkään eivät oo toimineet, joten toivottavasti löydätte ratkaisun.

void Map::load(std::string name)
{
    std::ifstream fin;
    std::string load_tmp = "Data/Map/"+name;
    fin.open(load_tmp.c_str());

    if(fin)
    {
        //Luetaan leveys, korkeus ja pelaajan aloituspaikka
        fin>>this->w>>this->h>>this->playerStartX>>this->playerStartY;

        //Luodaan pari apumuuttujaa
        std::string name;
		//onko seinä vai lattia tmp_w = true : seinä, muuten lattia.
        bool tmp_w;
        int type = 0;

		//vihun tiedot
        float enemyStartX, enemyStartY;
        short int enemyType, enemyStartSpeed, enemyStartEnergy;

		//Luetaan vihollisten määrä tiedostosta
        fin>>this->enemies;

		//jos vihollisia
        if(this->enemies)
        {
			//Varataan muisti vihollistaulukolle.
            this->tmp = new Enemy[this->enemies];

			//haetaan tiedostosta vihollisten tiedot ja sijoitetaan ne olioon.
            for(int i = 0; i > this->enemies; i++)
            {
                fin>>enemyType>>enemyStartX>>enemyStartY>>enemyStartSpeed>>enemyStartEnergy;

                this->tmp[i].setX(enemyStartX);
                this->tmp[i].setY(enemyStartY);
                this->tmp[i].setType(enemyType);
                this->tmp[i].setSpeed(enemyStartSpeed);
                this->tmp[i].setEnergy(enemyStartEnergy);
            }
        }



        //varataan muisti tilemapille
        tilemap = new Tile* [this->w];
        for(int i = 0; i < this->w; ++i)
            tilemap[i] = new Tile[this->h];


		///////////////////////////////////////////////
		///////////////////////////////////////////////
		///////////////////////////////////////////////
		/*
		Tässä silmukassa ongelma, jos vihollisia on enemmän kuin 0, niin tämäkin yrittää ladata vihollisten tietoja, miksei tää vaan jatka
		seuraavalta riviltä???????????????????????????

		Esimerkkiä tiedostosta (HUOM väliaikainen formaatti, teen binaarina, kuhan jaksan tehdä kenttäeditorin.)

		10 10 100 100

		1
		12 12 12 2 20

		tilejen tiedot...

		Jos alku on tuollainen, niin silmukka yrittää ladata kuvan, jonka nimi on 12, vaikka ei pitäis vaikuttaa noiden rivien ollenkaan tuohon tilejen lataukseen.

		10 10 100 100

		0

		tilejen tiedot...

		Tämä taas toimii ihan oikein... :S:S:S

		*/
        //ladataan tiedostosta tarvittavat tiedot
        for(int i = 0; i < this->w; i++)
        {
            for(int j = 0; j < this->h; j++)
            {
                fin>>name>>tmp_w>>type;

                this->tilemap[i][j].type = type;
                this->tilemap[i][j].wall = tmp_w;
                this->tilemap[i][j].image= this->loadImage(name);
            }
        }
    }
}

Metabolix [15.10.2009 17:14:12]

#

Ensimmäisellä pikaisella vilkaisulla:

vehkis91 kirjoitti:

for(int i = 0; i > this->enemies; i++)

Opettele käyttämään tavallisia debug-temppuja. Tämänkin olisit voinut ratkaista yksinkertaisesti tulostamalla tuossa viallisessa silmukassa ladatut tiedot (havainto: ei tulostu mitään, eli silmukkaa ei ajeta) tai lukemalla ja tulostamalla tiedostosta seuraavan rivin getline-funktiolla (tuloksena olisi ollut "12 12 12 2 20").
{std::string tmp; std::getline(fin >> std::ws, tmp); std::cout << tmp << std::endl;}

Toinen hyvä vaihtoehto olisi käyttää debuggeria, jolla voisi ajaa koodia rivi kerrallaan, jolloin taas näkisi suoraan, ettei silmukassa käydä. Toisaalta omakin havaintosi oli, että tiedostonimeksi tulee "12", jolloin pitäisi kyllä heti ymmärtää, että jostain syystä aiemmat tiedot ovat jääneet lukematta (eli luetaankin virheellisesti vasta seuraavassa vaiheessa).

P.S. Binaaritiedoston huono puoli on heikompi porttautuvuus esim. big endian -koneille tai muihin järjestelmiin, joissa tietotyypeillä on erilaiset koot ja/tai formaatit.

vehkis91 [15.10.2009 17:32:13]

#

Johan oli taas pieni vika... Vertailuoperaattori vain väärinpäin... No onneks huomasit sen.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta