Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Talennus engine

mika132 [06.03.2010 22:20:06]

#

Eli tein tiedoston .dat ja luultavasti paras tapa tehdä tallennus on joka riville tallentaa jotai tiettyä esim tyyliin:
tallennuksenaika
pelaaja.ase
pelaaja.x
pelaaja.y

ja se tallentuisi slot_1.dat tiedostoon näin:
12.12.2010.
1
50
140


En tiedä miten lähtisi toteuttamaan.

Ja miten ne sitten luetaan slot_1.dat tiedostosta?

vehkis91 [06.03.2010 22:51:45]

#

Perus tiedostojen käsittelyllä, muistaakseni sua on käsketty opetella tuota jo about 50 kertaa...

Päärynämies [07.03.2010 01:10:08]

#

Hae vaikka kirjastosta kirja ja lue siitä. Ei ole sen vaikeampaa. Tekemällä oppii.

mika132 [07.03.2010 02:14:58]

#

Luin erillaisia koodivinkkejä mutta nissää opetettiin vain tietojen ottaminen tiedostosta mutta ei tallentamista. Voisiko joku antaa hyvän vinkin netistä kun en itse löytänyt mitään parempaa.

vehkis91 [07.03.2010 03:22:15]

#

#include <fstream>

int main()
{
  std::ofstream fout("tiedosto.txt", std::ios::out);

  if(fout)
  {
     //laitetaan luku 12 tiedostoon
     fout<<12<<std::endl;
     //laitetaan vielä vähän tekstiä sinne
     fout<<"tekstiä"<<std::endl;
  }

  fout.close();

  return 0;
}

Teuro [07.03.2010 08:42:01]

#

Esimerkiksi vielä vaikkapa 'Pelaaja' luokan tallennus.

#include <fstream>
#include <string>
#include <stdexcept>

class Pelaaja{
    private:
        std::string nimi;
        int taso;
        int x;
        int y;
    public:
        Pelaaja(std::string n, int t, int x, int y){
            this->nimi = n;
            this->taso = t;
            this->x = x;
            this->y = y;
        }

        void Tallenna(){
            std::ofstream ulos("pelaaja.txt", std::ios::out);

            if(ulos){
                ulos << this->nimi << std::endl;
                ulos << this->taso << std::endl;
                ulos << this->x << std::endl;
                ulos << this->y << std::endl;
            }else{
                throw std::runtime_error("Tiedoston avaus ei onnistunut!");
            }
        }

        void Lataa(){
            std::ifstream sisaan("pelaja.txt", std::ios::in);

            if(sisaan){
                sisaan >> this->nimi;
                sisaan >> this->taso;
                sisaan >> this->x;
                sisaan >> this->y;
            }else{
               throw std::runtime_error("Tiedoston avaus ei onnistunut!");
            }
        }
};

int main(int kpl, char** argumentit){
    Pelaaja peluri("Juha", 12, 87, 53);

    try{
        peluri.Lataa();
    }catch(std::exception& e){
        std::cout << e.what() << std::endl;
    }

    try{
        peluri.Tallenna();
    }catch(std::exception& e){
        std::cout << e.what() << std::endl;
    }

    return EXIT_SUCCESS;
}

Ekalla ajolla pitäisi heittää virhe puuttuvasta tiedostosta latauksen yhteydessä ja pelurilla pitäisi olla annetut tiedot jäsenmuuttujissaan. Toisella vedolla latauksen pitäisi onnistua, jos ei tullut isoja mokia. Tämä on kirjoitettu duunissa ilman kääntäjää, joten virheitä voi olla.

Teuro [07.03.2010 18:26:42]

#

Koodia ei pidä ihan kauheasti muutella, jotta alkaa toimimaan. Ekana pitää lisätä puuttiuva otsikko iostream. Lisäksi Lataa metodiin pitää kirjoittaa oikean tiedoston nimi pelaja.txt asemasta pelaaja.txt. Näillä muutoksilla tuo tallentaa olion tiedot tiedostoon aivan oikein.

Vastaus

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

Tietoa sivustosta