Чтение объектов класса из файла в массив объектов класса

118
15 ноября 2020, 12:50

Здесь два главных класса: класс Поезд и класс Билеты, класс Билеты наследует класс Поезд. Проблема в том, что не могу считать из файла ( в который уже записаны данные ) объекты класса, пыталась разными способами, но всегда какие-то ошибки. Помогите пожалуйста

class Train {// класс, описывающий поезд
protected:
    string number;
    string path;
    string date;
    string time;
    int cars;
public:
    Train() {
        number = "-";
        path = "-";
        date = "--.--.----";
        time = "--:--";
        cars = 0;
    }
    void set_train(string number, string path, string date, string time, int cars) {
        this->number = number;
        this->path = path;
        this->date = date;
        this->time = time;
        this->cars = cars;
    }
    void ScanTrain() {
        cout << "\nВведите сведения о поезде: \nНомер: ";
        cin >> number;
        cout << endl << "Путь: ";
        cin >> path;
        cout << endl << "Дата отправления: ";
        cin >> date;
        cout << endl << "Время отправления: ";
        cin >> time;
        cout << endl << "Количество вагонов: ";
        cin >> cars;
    }
    string get_train() const {
        return "\nНомер поезда: " + number + "\nНаправление движения поезда: " + path + "\nДата отправления: " + date + "\nВремя отправления: " + time + "\nКоличество вагонов: " + to_string(cars);
    }
    string get_train(string num) const {
        if (this->number == num) {
            return  "\nНомер поезда: " + number + "\nНаправление движения поезда: " + path + "\nДата отправления: " + date + "\nВремя отправления: " + time + "\nКоличество вагонов: " + to_string(cars);
        }
        else return "Нет такого поезда";
    }
    //геттеры и сеттеры
    void set_number(string number) {
        this->number = number;
    }
    string get_number() const {
        return number;
    }
    void set_path(string path) {
        this->path = path;
    }
    string get_path() const {
        return path;
    }
    void set_date(string date) {
        this->date = date;
    }
    string get_date() const {
        return date;
    }
    void set_time(string time) {
        this->time = time;
    }
    string get_time() const {
        return time;
    }
    void set_cars(int cars) {
        this->cars = cars;
    }
    int get_cars() const {
        return cars;
    }
} poezd[3];
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class Tickets : public Train {
protected:
    struct Carriage {//вложенная структура, описывающая вагон поезда
        int number_of_carriage;
        string type_of_carriage;
        int sits;

        Carriage() {
            number_of_carriage = 0;
            type_of_carriage = "-";
            sits = 0;
        }
        void ScanСarriage() {
            cout << "\nНомер вагона: ";
            cin >> number_of_carriage;
            cout << "\nТип вагона: ";
            cin >> type_of_carriage;
        }

        void set_number_of_carriage(int number_of_carriage) {
            this->number_of_carriage = number_of_carriage;
        }
        int get_number_of_carriage() const {
            return number_of_carriage;
        }
        void set_type_of_carriage(string type_of_carriage) {
            this->type_of_carriage = type_of_carriage;
        }
        string get_type_of_carriage() const {
            return type_of_carriage;
        }
        void set_sits(string type_of_carriage) {
            if (type_of_carriage == "купе") {
                this->sits = 36;
            }
            if (type_of_carriage == "плацкарт") {
                this->sits = 54;
            }
            if (type_of_carriage == "общий") {
                this->sits = 81;
            }
        }
        int get_sits() const {
            return sits;
        }
    };
    string price;
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
    class Info {//вложенный класс, описывающий информацию о пассажире
    protected:
        string fio;
        int sit;
    public:

        Info() {
            fio = "-";
            sit = 0;
        }
        void ScanInfo() {
            cout << "\nВведите данные о пассажире: \nФИО: ";
            cin >> fio;
            cout << "\nМесто: ";
            cin >> sit;
        }
        void set_info(string fio, int sit) {
            this->fio = fio;
            this->sit = sit;
        }
        string get_info() const {
            return "\nСведения о пассажире: \nФИО: " + fio + "\nМесто: " + to_string(sit);
        }
        void set_fio(string fio) {
            this->fio = fio;
        }
        string get_fio() const {
            return "\nФИО пассажира: " + fio;
        }
        void set_sit(int sit) {
            this->sit = sit;
        } //надо понять, когда и где ее вызвать и проверить
        int get_sit() const {
            cout << "\nМесто: ";
            return sit;
        }
    };
    string number;
    Train train;
    Carriage carriage;
    Info data;
public:
    void read(ifstream *in) {
        in->read((char *)this, sizeof(Tickets));
        if (in->fail())
            cout << "read failed" << endl;
    }
    Tickets() {
        price = "00p.";
    }

    Tickets(string number, string path, string date, string time, int cars, int number_of_carriage, string type_of_carriage, int sits, string price,
        string fio, int sit) { // конструктор с параметрами
        //train.set_train(number, path, date, time);
        this->carriage.number_of_carriage = number_of_carriage;
        this->carriage.type_of_carriage = type_of_carriage;
        this->price = price;
        data.set_info(fio, sit);
    }
    /*Tickets() { // конструктор копирования
    }
    */
    ~Tickets() { // деструктор
        //cout << "\nСработал деструктор";
    }

    /*void deleteObj()
    { //Delete object from list
        cout << "Введите номер поезда" << endl;
        int temp;
        cin >> temp;
        bool find;
        for (int i = 0; i < size; i++) {
            if (temp == ticket[size].getPostavCode()) {
                ticket[size].show();
                find = true;
                g.erase(g.begin() + i);
                break;
            }
        }
        if (!find) cout << "Не удалось найти объект для удаления" << endl;
    }*/

    string get_price(string type_of_carriage, string priceK, string priceP, string priceO) const {
        if (type_of_carriage == "Купе") {
            return  priceK;
        }
        if (type_of_carriage == "Плацкарт") {
            return  priceP;
        }
        if (type_of_carriage == "Общий") {
            return  priceO;
        }
    }
    void set_price(string price) {
        this->price = price;
    }
    string get_price() const {
        return price;
    }

    /*void writeToFile(string pathtofile) {
        ofstream fout(pathtofile, ios_base::app); //запись в файл, ios_base - флаг режима для открытия файла
        Train train;
        fout << train.number << " " << flower.name << " " << carriage.type_of_carriage << " " << flower.family << " " << flower.country << " " << flower.goden << endl;
        fout.close();
    }
    void output() { //Output to file
        cout << "Введите имя файла с расширением" << endl;
        cin >> fname;
        for (int i = 0; i < garden.n; i++) {
            flower.writeToFile(name);
        }
    }
    void input() {
        cout << "Введите имя файла с расширением" << endl;
        cin >> fname;
        ifstream fin(fname); //чтение из файла
        int code;
        string name;
        string type;
        string family;
        string country;
        int goden;
        int left;
        int code_post;
        do {
            fin >> code >> name >> type >> family >> country >> goden >> left >> code_post;
        } while (!fin.eof());
        fin.close();
    }*/
    //void Scan() {
    //  string n, p, d, t, f, typec;
    //  int s, numberc;
    //  cout << "\nНомер поезда: ";
    //  cin >> number;
    //  /*cout << "\nНаправление движения поезда: ";
    //  cin >> p;
    //  cout << "\nДата отправления: ";
    //  cin >> d;
    //  cout << "\nВремя отправления: ";
    //  cin >> t;
    //  train.set_train(n, p, d, t);*/
    //  cout << "\nНомер вагона: ";
    //  cin >> carriage.number_of_carriage;
    //  cout << "\nТип вагона: ";
    //  cin >> carriage.type_of_carriage;
    //  cout << "\nЦена билета: ";
    //  cin >> price;
    //  cout << "\nФИО пассажира: ";
    //  cin >> f;
    //  cout << "\nМесто пассажира: ";
    //  cin >> s;
    //  data.set_info(f, s);
    //}
    //void Print(Train* t) {
    //  //train.get_train();
    //  cout << "\nНомер вагона: " << carriage.number_of_carriage
    //      << "\nТип вагона: " << carriage.type_of_carriage << "\nЦена билета: "
    //      << price;
    //  for (int n = 0; n < 10; n++) {
    //      if(t[n]->)
    //  }
    //  data.get_info();
    //  cout << "\n";
    //}
    void Print(string number) {
        cout << get_train(number);
        cout << "\nНомер вагона: " << get_number_of_carriage()
            << "\nТип вагона: " << get_type_of_carriage() << "\nЦена билета: "
            << price;
        cout << data.get_info();
        cout << "\n";
    }
    //для train
    /*string get_train() const {
        return train.get_train();
    }
    void set_number(string number) {
        set_number(number);
    }
    string get_number() const {
        return train.get_number();
    }
    void set_path(string path) {
        set_path(path);
    }
    string get_path() const {
        return train.get_path();
    }
    void set_date(string date) {
        set_date(date);
    }
    string get_date() const {
        return train.get_date();
    }
    void set_time(string time) {
        set_fio(time);
    }
    string get_time() const {
        return train.get_time();
    }
    */
    //для carriage
    void set_number_of_carriage(int number_of_carriage) {
        this->carriage.set_number_of_carriage(number_of_carriage);
    }
    int get_number_of_carriage() const {
        return carriage.get_number_of_carriage();
    }
    void set_type_of_carriage(string type_of_carriage) {
        this->carriage.set_type_of_carriage(type_of_carriage);
    }
    string get_type_of_carriage() const {
        return carriage.get_type_of_carriage();
    }
    void set_sits(string type_of_carriage) {
        this->carriage.set_sits(type_of_carriage);
    }
    int get_sits() const {
        return carriage.get_sits();
    }
    void Get_Carriage(Carriage carriage) {// ?????????????????????????????????????????????
        set_number_of_carriage(carriage.get_number_of_carriage());
        set_type_of_carriage(carriage.get_type_of_carriage());
    }
    void Get_Train() {
        this->set_number(train.get_number());
        this->set_path(train.get_path());
        this->set_date(train.get_date());
        this->set_time(train.get_time());
        this->set_cars(train.get_cars());
    }
    //для info
    void set_fio(string fio) {
        data.set_fio(fio);
    }
    string get_fio() const {
        return data.get_fio();
    }
    void set_sit(int sit) {
        data.set_sit(sit);
    }
    int get_sit() const {
        return data.get_sit();
    }

    void ScanCarriage() {
        carriage.ScanСarriage();
    }
    void ScanInfo() {
        data.ScanInfo();
    }
};

//поиск при покупке
void buying() {
    string pathtoT = "Tickets.txt";
    string pathtoBT = "BoughtTickets.txt";
    ifstream file;
    fstream boughtTickets;
    int size = 100000;
    Tickets *temp_tickets = new Tickets[size];
    string temp_path;
    string temp_date;
    cout << "\nНаправление движения поезда: ";
    cin >> temp_path;
    cout << "\nДата отправления поезда: ";
    cin >> temp_date;
    file.open(pathtoT);
    //Tickets tik;
    int s = 0;

вот те способы, которыми я пыталась, к слову, с перегрузкой у меня тоже не получилось

    if (!file.is_open() && !boughtTickets.is_open()) {
        cout << "\nОшибка открытия файла!" << endl;
    }
    else {
        cout << "\nФайл успешно открыт!" << endl;
        while (true) {
            //file >> temp_tickets[s];
            //file.read((char*)&temp_tickets[s], sizeof(temp_tickets[s]));
            //temp_tickets[s].read(&file);
            temp_tickets[s].Print(temp_tickets[s].get_number());
            if (file.eof()) {
                break;
            }
            s++;
        }

дальше код не нужен вроде, мне бы с этим разобраться

READ ALSO
Не могу вызвать функцию _beginthread(..), c++

Не могу вызвать функцию _beginthread(..), c++

Хочу запустить метод в отдельном потоке при помощи функции _beginthread(), но получаю ошибку, если не было указано void* в аргументах функции

126
Ограничение символов QTextEdit

Ограничение символов QTextEdit

Есть ли в Qt метод, который ограничивает кол-во вводимых символов в QTextEdit или придется самому его реализоаывать?

109
Реализовать последовательность

Реализовать последовательность

Мне нужно реализовать последовательность https://oeisorg/A323119 на С++, но конкретных формул нет

103
Проблема с функцие strcut_s(); [закрыт]

Проблема с функцие strcut_s(); [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

102