mam pytanko
w jaki sposob zapisac binarnie do pliku klase.
np mam
class cos;
cos obiekt;
i jak teraz "obiekt" zapisac binarnie do pliku
a potem jak to odczytac
dziekuje z gory za pomoc
mam pytanko
w jaki sposob zapisac binarnie do pliku klase.
np mam
class cos;
cos obiekt;
i jak teraz "obiekt" zapisac binarnie do pliku
a potem jak to odczytac
dziekuje z gory za pomoc
Radzę to zrobić tak w C++:
http://www.parashift.com/c++-faq-lite/input-output.html
http://www.parashift.com/c++-faq-lite/serialization.html
i bynajmniej nie zapisywać pamięci obiektu (chyba, że klasa jest tak trywialna, że zawiera tylko jedną zmienną składową... ehm, która nie jest wskaźnikiem i nie jest bardziej złożona niż typ prosty i to jeszcze najlepiej 1 bajtowy, w innym wypadku kłopoty, kłopoty...)
class klasa{
public:
klasa();
klasa(klasa& old);
~klasa();
int save(char* plik); // zamiast inta moze byc bool;
int load(char* plik);
protected: // czy jak tam masz private
int dana1;
char* dana2;
struct {
int abc;
float def;
char ghi[128];
} dana3;
};
int klasa::save(char* plik){
FILE* f=fopen(plik,"w+b");
if|(!f)return 0;
int ret=0;
if(fwrite(&dana1,sizeof(dana1),1,f)!=1)goto error;
if(fwrite(dana2,ile tam jej przydzieliles podczas tworzenia,1,f)!=1)goto error;
if(fwrite(&dana3,sizeof(dana3),1,f)^1)goto error; // ^ czy != ten sam wynik w tym wypadku
ret=1;
error:
fclose(f);
return ret;
}
int klasa::save(char* plik){
FILE* f=fopen(plik,"rb");
if|(!f)return 0;
int ret=0;
if(fread(&dana1,sizeof(dana1),1,f)^1)goto error;
if(fread(dana2,ile wpisales podczas zapisu,1,f)!=1)goto error;
if(fread(&dana3,sizeof(dana3),1,f)^1)goto error; // ^ czy != ten sam wynik w tym wypadku
ret=1;
error:
fclose(f);
return ret;
}
class klasa{
protected: // czy jak tam masz private
[...]
char* dana2;
[...]
};
[...]
int klasa::save(char* plik){
FILE* f=fopen(plik,"rb");
[....]
if(fread(dana2,ile wpisales podczas zapisu,1,f)!=1)goto error;
[....]
return ret;
}
Powodzenia... Mówiłem... Kłopoty, kłopoty...
A jako ćwiczenie na takie zapisywanie jw. polecam klasę :> :
class Test
{
string s;
vector<int> vi;
InnaKlasa *pik;
};
dzieki za odpowiedz
zastanawiam sie czy da sei to zrobic z uzyciem biblioteki fstream.h
bo powysze rozwiazanei jest z wykorzystanie bilioteki stdio.h
dzieki za odpowiedz
zastanawiam sie czy da sei to zrobic z uzyciem biblioteki fstream.h
bo powysze rozwiazanei jest z wykorzystanie bilioteki stdio.h
Da się. :)
Odczyt:
ifstream in("nazwa_pliku", ios::in | ios::binary);
in.read((char*)&obiekt, sizeof(obiekt));
zapis:
ofstream out("nazwa_pliku", ios::out | ios::binary);
out.write((char*)&obiekt,sizeof(obiekt));