Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Binääritiedoston luku ja kirjoitus

kayttaja-3842 [06.05.2010 17:24:23]

#

Elikkäs tekasin peliini MapEditorin, mutta tuli eräs ongelma vastaan. Kun tallennan eka kartan binääri tiedostoon. Okei toimii hienosti, sitten avaan tiedoston mapeditorilla ja aukee hienosti. Sitten kun avaan kartta tiedoston taas pelissäni kartta latautuu hienosti, mutta kun sammutan pelin niin peli kaatuu, eli ei sammutuksen yhteydessä kaatuu jostain syystä. Mikä tässä voisi olla vikana? Olisiko syys virheelisessä tallentamisessa vai missä?

    struct Tile{
      int x;
      int y;
      int w;
      int h;
      bool show;
    };

    struct Player_Map{
     int x;
     int y;
     bool show;
    };

    struct MapFile{
     string tileset;
     Tile tiles[20][15];
     Player_Map player;
    };


 //editor.map on MapFile tyyppinen.

void Editor::saveMap(){

  ofstream myFile ("map.map", ios::out | ios::binary);
   myFile.seekp(0);
   //Onko tässä sizeof kohta okein vai väärin?
   myFile.write ((char*)&editor.map, sizeof(MapFile));
  myFile.close();

}

void Editor::loadMap(){

  ifstream myFile ("map.map", ios::in|ios::binary|ios::ate);
   myFile.seekg (0, ios::beg);
   myFile.read( (char*) &editor.map, sizeof(MapFile) );
  myFile.close();

}

Metabolix [06.05.2010 17:32:03]

#

Et voi tallentaa string-oliota tuolla tavalla, koska string-olion sisältö näyttää oikeasti suunnilleen tältä (rankasti yksinkertaistettuna):

class string {
  char* data;
  int length, reserved_size;
};

Toisin sanoen koodisi tallentaa nyt tiedostoon merkityksettömiä osoittimia ja lukuja eikä suinkaan oikeaa tekstiä.

Voit tallentaa erikseen tuon string-olion (vaikka <<-operaattorilla omalle rivilleen; lukemisessa getline-funktio on paras), jolloin varsinainen write (ja read) pitää muuttaa niin, ettei se koske enää stringiin. Toinen vaihtoehto on käyttää stringin sijaan perinteistä char-taulukkoa, jolloin tekstin pituus on aina sama ja liian pitkät tilesetit aiheuttavat virheen.

kayttaja-3842 [06.05.2010 17:34:21]

#

Joo tosiaa, nytten toimii. Kiitos paljon Metabolix. :)

Vastaus

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

Tietoa sivustosta