Wczytywanie z pliku do wektora przechowującego obiekty klas pochodnych

0

Cześć mój program ma klasę Pojazd i trzy klasy dziedziczne: Samochód, Motocykl i Rower. Klasa bazowa ma składowe takie jak model, przebieg, cena. Każda z klas dziedzicznych dodaje swoje składowe (np. Samochód ma zmienna iloscDrzwi, moc itp.) Moje pojazdy przechowuję w wektorze inteligentnych wskaźników. Program ma możliwość zapisywania elementów do pliku. Przykładowy plik txt wygląda tak:

Passat czerwony 80017 565 0 55 10 10.2 170 3
Yamaha niebieski 16004 25 0 12 4 2.4 40
Trek czarny 4000 10 0 1

Nie mam jednak pomysłu jak mógłbym wczytać takie dane z pliku do wektora. Problematyczne jest dla mnie to że każdy rodzaj pojazdu ma inną ilość zmiennych. W poprzedniej wersji programu, która miała tylko jedną klasę Samochod wczytywałem dane w ten sposób, jednak teraz nie ma prawa to zadziałać z uwagi na to że mam parę klas z różnymi zmiennymi.

while (plikP >> model >> pojemnoscBaku >> cena >> spalanie >> moc >> paliwo >> przebieg)
        {
            Samochod wczytajSamochod(model, pojemnoscBaku, cena, spalanie, moc, paliwo, przebieg); //wektor pomocniczy
            samochody.push_back(wczytajSamochod);
        }

Jedyne na co wpadłem to aby dołożyć do każdej klasy informacje jakiego rodzaju jest to pojazd (np. dla samochodu: char rodzaj = 'S'), po czym zapisywać tą informacje jako pierwszą w każdej linii. Następnie podczas wczytywania stworzyć instrukcje sprawdzająca co kryję się pod pierwszym wyrazem w każdej linii, a następnie uruchomić odpowiednią pętle while wczytującą dane odpowiedne dla każdego rodzaju pojazdu. Jednak nie mam pojęcia jak napisać kod który czyta tylko pierwszy wyraz z linii, po czym wykonuję odpowiednią instrukcje, po której przechodzi do następnej linii powtarza całą operacje.
Czy ktoś byłby wstanie pomóc mi zrealizować mój pomysł lub zasugerować inne rozwiązanie mojego problemu?

1

@janullo789: nie musisz wczytywać wszystko od razu w warunku while. Wczytaj pierwszy wyraz i na jego podstawie stwierdź z jakim pojazdem masz do czynienia. Musisz mieć jednak jakąś bazę danych nazw producentów pojazdów żeby było z czym porównywać.

Jak liczba pozycji określa typ pojazdu to wczytaj całą linię getline i policz ile jest napisów oddzielonych białymi znakami a potem to już z górki

2

Pomysł z nowym polem, który określa typ obiektu jest bardzo dobry !!!
Jeżeli można te pole wstawić do danych to bezwzględnie trzeba to zrobić.

Odczyt takiego pliku jest banalnie prosty.

// taki pseudokod !!

char typ; 

 while ( plikP >> typ >> model  >> cena )
  {
    
    switch ( typ )
    {
      case 'S':  
       std::plikP >> drzwi    
       wczytajSamochod( model,  cena, drzwi )
       break;
      
      case 'R': 
       std::plikP >> ile_przerzutek >> czy_lampka
        wczytajRower( model, cena, ile_przerzutek, czy_lampka)
       break;

      case 'H':  
        // itd .....
      break;

      default:
        assert(false && "Nie jest znany typ");
   
    }
}

Przykładowe dane dla tego przykładu to:

S Fiat 10 4
R Romet 14 2 1

Osobiście jednak sądzę, że taki format zapisu danych jest bardzo podatny na błędy np. człowiek coś doda/posuje, zmieni się wersja/sposób zapisu danych itp, itd...
Warto więc może dodać jakieś dane weryfikujące lub informacyjne.
Ale nie format danych był tematem tego zapytania :)

1
janullo789 napisał(a):

Jednak nie mam pojęcia jak napisać kod który czyta tylko pierwszy wyraz z linii

getline() moze przyjmowac separator jako parametr. stringstream tez moze sie przydac.
Poza tym, mimo ze fanem wciskania obiektowosci wszedzie gdzie sie da nie jestem, to w tym przypadku az sie narzuca. Dodaj jakas metode do swoich klas, np. oryginalnie nazwana "deserialize" i jak juz wiesz jaki obiekt wczytujesz to niech ten obiekt sam sie zajmuje swoimi polami, ktore z duzym prawdopodobienstwem tylko on powinien znac. A jak chcesz zaszalec to mozesz dodac metode typu "isValid", wolac ja dla kazdego pojazdu i kod zewnetrzny nie bedzie musial robic zadnego sprawdzania w if/switch konkretnego typu. Albo np. "deserialize" bedzie zwracalo czy to jest linia nalezaca do danego pojazdu i czy obiekt zostal stworzony i uzyska sie podobny efekt dla kodu zewnetrznego.

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