zapis/odczyt binarny

0

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

0

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...)

0
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;
}
0
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;
};
0

dzieki za odpowiedz

zastanawiam sie czy da sei to zrobic z uzyciem biblioteki fstream.h
bo powysze rozwiazanei jest z wykorzystanie bilioteki stdio.h

0

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));

1 użytkowników online, w tym zalogowanych: 0, gości: 1