WItam,
mam problem z wczytywaniem do listy wskaźników klasy bazowej klas pochodnych z pliku binarnego
Mój kod wygląda tak
class Baza_pojazdow
{
public:
int size;
deque<Pojazd*> pojazdy;
string nazwa_pliku;
void wczytaj()
{
ifstream dane(nazwa_pliku, ios::binary);
string wybor;
while (!dane.eof())
{
dane.read((char*)(&wybor), sizeof(string));
if (wybor == "osobowy")
{
char* temp = new char[sizeof(Osobowy)];
dane.read(temp, sizeof(Osobowy));
Pojazd* nowy = (Osobowy*)temp;
pojazdy.push_back(nowy);
}
}
dane.close();
}
Używam VS 2019 i w debugerze widzę że wszystkie dane dobrze się wczytały ale w momencie zakończenia się funkcji wczytaj wyskakuje mi błąd
Zgłoszono wyjątek: naruszenie dostępu do odczytu.
_Pnext było 0x19EB44.
w pliku xmemory0
for (_Iterator_base12** _Pnext = &_Myproxy->_Myfirstiter; *_Pnext != nullptr; // <-- o tu
*_Pnext = (*_Pnext)->_Mynextiter) {
(*_Pnext)->_Myproxy = nullptr;
}
nie znalazłem nic w internecie na ten temat, z góry dziękuje za odpowiedz
to reszta kodu
include <iostream>
#include <fstream>
#include <deque>
#include <string>
#include <algorithm>
using namespace std;
class Pojazd
{
protected:
string jaki;
string marka;
string rejestracja;
short int rok_produkcji;
short int moc_silnika;
short int pojemnosc_baku;
public:
Pojazd() {}
Pojazd(string _jaki, string _marka, string _rejestracja,short int _rok_produkcji, short int _moc_silnika, short int _pojemnosc_baku)
: jaki(_jaki), marka(_marka), rejestracja(_rejestracja), rok_produkcji(_rok_produkcji), moc_silnika(_moc_silnika), pojemnosc_baku(_pojemnosc_baku) {}
virtual ~Pojazd() {}
virtual void wyswietl() = 0;
void podstawowe_info()
{
cout << "----------------------------------------\n";
cout << "typ: " << jaki << "\n";
cout << "marka: " << marka << "\n";
cout << "rejestracja: " << rejestracja << "\n";
cout << "rok produkcji: " << rok_produkcji << "\n";
cout << "moc silnika: " << moc_silnika << " KM\n";
cout << "pojemnosc baku: " << pojemnosc_baku << " l\n";
}
virtual void zapisz(ofstream &dane) = 0;
};
class Osobowy : public Pojazd
{
private:
short int ilosc_miejsc;
short int pojemnosc_bagaznika;
public:
Osobowy()
:ilosc_miejsc(0), pojemnosc_bagaznika(0) {}
Osobowy(string _jaki, string _marka, string _rejestracja, short int _rok_produkcji, short int _moc_silnika, short int _pojemnosc_baku, short int _ilosc_miejsc, short int _pojemnosc_bagaznika)
: Pojazd(_jaki, _marka, _rejestracja, _rok_produkcji, _moc_silnika, _pojemnosc_baku), ilosc_miejsc(_ilosc_miejsc), pojemnosc_bagaznika(_pojemnosc_bagaznika) {}
virtual ~Osobowy () {}
virtual void wyswietl()
{
podstawowe_info();
cout << "ilosc miejsc: " << ilosc_miejsc << "\n";
cout << "pojemność bagaznika: " << pojemnosc_bagaznika << "\n";
}
virtual void zapisz(ofstream &dane)
{
dane.write((char*)(&jaki), sizeof(jaki));
dane.write((char*)(this), sizeof(Osobowy));
}
};
class Motor : public Pojazd
{
private:
bool czy_z_doczepka;
public:
Motor() {}
Motor(string _jaki, string _marka, string _rejestracja, short int _rok_produkcji, short int _moc_silnika, short int _pojemnosc_baku, bool _czy_z_doczepka)
: Pojazd(_jaki, _marka, _rejestracja, _rok_produkcji, _moc_silnika, _pojemnosc_baku), czy_z_doczepka(_czy_z_doczepka) {}
virtual ~Motor() {}
virtual void wyswietl()
{
podstawowe_info();
cout << "czy z doczepka: " << (czy_z_doczepka ? "TAK" : "NIE") << "\n";
}
virtual void zapisz(ofstream &dane)
{
dane.write((char*)(&jaki), sizeof(jaki));
dane.write((char*)(this), sizeof(Osobowy));
}
};
class Baza_pojazdow
{
public:
int size;
deque<Pojazd*> pojazdy;
string nazwa_pliku;
void wczytaj()
{
ifstream dane(nazwa_pliku, ios::binary);
string wybor;
while (!dane.eof())
{
dane.read((char*)(&wybor), sizeof(string));
if (wybor == "osobowy")
{
char* temp = new char[sizeof(Osobowy)];
dane.read(temp, sizeof(Osobowy));
Pojazd* nowy = (Osobowy*)temp;
pojazdy.push_back(nowy);
}
}
dane.close();
}
Baza_pojazdow()
: size(0), nazwa_pliku("dane.bin")
{}
~Baza_pojazdow()
{}
void Dodaj()
{
system("CLS");
cout << "Jaki pojazd chcesz dodac?\n1 - osobowy\n2 -motor\n";
short int wybor;
while (true)
{
try
{
cin >> wybor;
if (wybor != 1 && wybor != 2)
throw 1;
else
break;
}
catch (...)
{
cout << "Podales zly numer! sproboj jeszcze raz\n";
}
}
if (wybor == 1)
{
system("CLS");
cout << "Dodawanie samochodu osobowego\n----------------------------------------\n";
string _jaki="osobowy";
string _marka;
string _rejestracja;
short int _rok_produkcji;
short int _moc_silnika;
short int _pojemnosc_baku;
short int _ilosc_miejsc;
short int _pojemnosc_bagaznika;
cout << "Podaj marke: ";
cin >> _marka;
cout << "\n";
cout << "Podaj rejestracje: ";
cin >> _rejestracja;
cout << "\n";
cout << "Podaj rok produkcji: ";
cin >> _rok_produkcji;
cout << "\n";
cout << "Podaj moc silnika: ";
cin >> _moc_silnika;
cout << "\n";
cout << "Podaj pojemnosc baku: ";
cin >> _pojemnosc_baku;
cout << "\n";
cout << "Podaj ilosc miejsc: ";
cin >> _ilosc_miejsc;
cout << "\n";
cout << "Podaj pojemnosc bagaznika: ";
cin >> _pojemnosc_bagaznika;
cout << "\n";
pojazdy.push_back(new Osobowy(_jaki, _marka, _rejestracja, _rok_produkcji, _moc_silnika, _pojemnosc_baku, _ilosc_miejsc, _pojemnosc_bagaznika));
}
size++;
}
void zapisz()
{
ofstream dane(nazwa_pliku, ios::binary);
dane.clear();
for_each(pojazdy.begin(), pojazdy.end(), [&](Pojazd* do_zapisu) {do_zapisu->zapisz(dane); });
dane.close();
}
void wyswietl()
{
system("CLS");
for_each(pojazdy.begin(), pojazdy.end(), [&](Pojazd* do_wyswietlenia) {do_wyswietlenia->wyswietl(); });
}
};
int main()
{
Baza_pojazdow baza;
while (true)
{
system("CLS");
int wybor;
cout << " 1 - dodaj, 2 - wyswietl, 3 - zapisz, 4 - wczytaj\n";
cin >> wybor;
switch (wybor)
{
case 1:
baza.Dodaj();
break;
case 2:
baza.wyswietl();
break;
case 3:
baza.zapisz();
break;
case 4:
baza.wczytaj();
break;
}
}
}