Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Luokan tallennus

Sivun loppuun

DumTom [02.02.2008 14:06:38]

#

Pystyykö C++:lla tallentamaan luokan tietojäsenet jollakin helpolla tavalla?

Markus [02.02.2008 16:00:46]

#

Jos luokka ei sisällä osoittimia, voit voit yksinkertaisesti kirjoittaa koko luokan tiedostoon.

file.write(&luokka, sizeof(luokka));

Ja takaisin lukeminen:

file.read(&luokka, sizeof(luokka));

Jos luokka sisältää osoittimia, ei temppu toimi, sillä tällöin tulee kirjoitettua vain osoittimen arvo (muistipaikan numero) eikä sen kohde.

os [02.02.2008 16:20:06]

#

Tuokaan ei välttämättä toimi eri koneiden ja kääntäjien välillä, koska kääntäjä saattaa varata luokalle ylimääräistä muistia. Lisäksi normaalienkin jäsenten koko ja binääriesitykset vaihtelevat eri arkkitehtuurien välillä. Esimerkiksi int-tyypin koko voi (käytännössäkin) olla 4 tai 8 tavua. Lisäksi tyyppien binääriesityksen tavujärjestys vaihtelee (tiedoston samat 4 tavua tulkitaan eri luvuiksi eri arkkitehtuureilla)

DumTom [03.02.2008 13:59:28]

#

Kuinka saan tuon file.writen toimimaan?
Eli mikä headerfile pitää includata?
Ja kai tiedosto on ensin avattava?

os [04.02.2008 15:32:16]

#

http://www.cplusplus.com/reference/iostream/ostream/write.html

file tarkoittaa tuossa tiedosto-oliota, joka pitää tietysti luoda ennen, kun tuota voi käyttää:

#include <fstream>

// ...

struct { unsigned a, b, c; } olio = { 1, 2, 3 };

std::ofstream file("tiedosto.dat");
file.write((const char*)&olio, sizeof(olio));

DumTom [07.02.2008 12:23:41]

#

Tiedosto suljetaan kai file.close();lla?
Mutta kuinkas luen tuon tiedoston?
Sitä en saanut toimimaan.
Hämäriä virheilmoituksia.
Apua!!!!

Metabolix [07.02.2008 16:19:56]

#

Lukeminen toimii kuten kirjoittaminenkin, kunhan vaihdat write-metodin read-metodiin ja ofstreamin ifstreamiin.

DumTom [08.02.2008 00:53:03]

#

Joo,kiitos.Sain toimimaan paitsi että readistä piti poistaa toi const.

os [09.02.2008 13:32:05]

#

DumTom kirjoitti:

Tiedosto suljetaan kai file.close();lla?

Tiedostoja ei välttämättä tarvitse sulkea closella, koska tiedosto-objektin destruktori kutsuu closea automaattisesti. Esimerkiksi:

struct { unsigned a, b, c; } olio;
if(1)
{
  std::ifstream file("tiedosto.dat");
  file.read((char*)&olio, sizeof(olio));
} // Tiedosto suljetaan tässä lohkon lopussa

readin kanssa ei käytetä constia, koska olion dataa muokataan. writeen se taas kuulu, koska dataa vain luetaan.

DumTom [10.02.2008 08:09:37]

#

Kiitos os:llä ja Markukselle!
Tämä helpottaa save gamen tekoa erääseen massiiviseen projektiin..


Sivun alkuun

Vastaus

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

Tietoa sivustosta