Pystyykö C++:lla tallentamaan luokan tietojäsenet jollakin helpolla tavalla?
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.
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)
Kuinka saan tuon file.writen toimimaan?
Eli mikä headerfile pitää includata?
Ja kai tiedosto on ensin avattava?
http://www.cplusplus.com/reference/iostream/
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));
Tiedosto suljetaan kai file.close();lla?
Mutta kuinkas luen tuon tiedoston?
Sitä en saanut toimimaan.
Hämäriä virheilmoituksia.
Apua!!!!
Lukeminen toimii kuten kirjoittaminenkin, kunhan vaihdat write-metodin read-metodiin ja ofstreamin ifstreamiin.
Joo,kiitos.Sain toimimaan paitsi että readistä piti poistaa toi const.
DumTom kirjoitti:
Tiedosto suljetaan kai file.close();lla?
Tiedostoja ei välttämättä tarvitse sulkea close
lla, 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
read
in kanssa ei käytetä const
ia, koska olio
n dataa muokataan. write
en se taas kuulu, koska dataa vain luetaan.
Kiitos os:llä ja Markukselle!
Tämä helpottaa save gamen tekoa erääseen massiiviseen projektiin..
Aihe on jo aika vanha, joten et voi enää vastata siihen.