problem z odczytem klasy

0
#ifndef KONTAKT_H
#define KONTAKT_H

#include <string>

using namespace std;

class Kontakt
{
        public:
                string PodajImie() { return Imie; }
                string PodajNazwisko() { return Nazwisko; }
                void ZapiszImie(string imie) {Imie = imie; }
                void ZapiszNazwisko(string nazwisko) { Nazwisko = nazwisko; }
        private:
                string Imie;
                string Nazwisko;
};

#endif 
#include <vcl.h>
#include <iostream>
#include <fstream>
#include "kontakt.h"
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

using namespace std;

void zapisz()
{
        ofstream ofs("lol.txt", ios::binary);
        Kontakt *osoba = new Kontakt;
        osoba->ZapiszImie("imie");
        osoba->ZapiszNazwisko("nazwisko");
        ofs.write((char*)(osoba), sizeof(Kontakt));
        ofs.close();
        delete osoba;
}

void wczytaj()
{
        ifstream ifs("lol.txt", ios::binary);
        char* temp = new char[sizeof(Kontakt)];
        ifs.read(temp, sizeof(Kontakt));
        Kontakt* osoba = (Kontakt*)(temp);
        cout << osoba->PodajImie() <<  " " << osoba->PodajNazwisko() << endl;
        delete [] temp;
        ifs.close();
}

int main(int argc, char* argv[])
{
        zapisz();//<----problem się pojawia jak usunę ta linijka     
        wczytaj();
        system("PAUSE");
        return 0;
} 
0

ja tu widzę więcej problemów.

  1. Nie stworzyłeś, żadnego sposobu by funkcje się ze sobą komunikowały.
  2. pokręciłeś zapis i odczyt
  3. masz wyciek pamięci
  4. binarne wczytanie/zapisanie klasy w ten sposób to same kłopoty. Tak nie wolno! Zwłaszcza, że string zapamiętuje napis w alokowanej pamięci, więc nie zapiszesz zawartości tych napisów w klasie, ani ich nie odczytasz.
0

zainteresuj się serializacją w c++

0

zmieniłem stringi na tablice char i usunąłem wyciek i działa tak jak powinno dzięki za pomoc
funkcje znalazłem na te stronie zmieniłem je tło pod kątem nazw i typu danej zapisywanej danej.
Powiedz jeszcze po co komunikacja między tymi funkcjami

0

Niech funkcje zapisz i wczytaj będą metodami klasy Kontakt. Po co ci funkcja który tworzy obiekt, wczytuje dane i zaraz niszczy obiekt, tak że nie ma po nim śladu. Równie dobrze mógłbyś nie wywoływać tej funkcji i na to samo by wyszło.
Tak powinien wyglądać kod testowy, ułóż klasę pod niego:

int main(int argc, char* argv[])
{
        Kontakt kontakt;
        kontakt.Wczytaj("lol.dat");
        cout << "Wczytalem: " << kontakt.PodajImie() << ' ' << kontakt.PodajNazwisko() << endl;

        string str;
        cout << "Podaj nowe imie: ";
        cin >> str;
        kontakt.ZapiszImie(str);
        cout << "Podaj nowe nazwisko: ";
        cin >> str;
        kontakt.ZapiszNazwisko(str);
        kontakt.Zapisz("lol.dat");
        cout << "Zapisalem: " << kontakt.PodajImie() << ' ' << kontakt.PodajNazwisko() << endl;

        system("PAUSE");
        return 0;
}
0

ja to tylko stworzyłem dla potrzeby tego postu chce stworzyć jeszcze klasę książka adresowa która będzie przechowywała tablice obiektów klasy kontakt i tam chce umieścić zapis i wczytywanie danych
a poza tym dopiero się ucze

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