• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z obiektowym wczytywaniem danych z pliku tekstowego. C++

Mały hosting, OGROMNE możliwości
0 głosów
456 wizyt
pytanie zadane 27 października 2020 w C i C++ przez DzikieHarce Użytkownik (690 p.)

Hej, mam problem z wczytaniem danych z pliku tekstowego do kilku obiektów. Stworzyłam klasę Czapki, dziedziczącą po abstrakcyjnej klasie Ubranie. Klasa Czapki na konstruktor który jako parametr przyjmuję nazwę pliku który ma otworzyć.

Czapki::Czapki(string const& Sciezka)
{
	fstream plik;
	plik.open(Sciezka.c_str(), std::ios::in | std::ios::out);
	if (plik.good())
	{
		string linia;
		int nrLinii = (1 - 1) * 7 + 1;
		int licznik = 1;
		while (getline(plik, linia))
		{
			if (licznik == nrLinii)
			{
				kolor = linia;
			}
			if (licznik == nrLinii + 1)
			{
				opis = linia;
			}
			if (licznik == nrLinii + 2)
			{
				płeć = linia;
			}
			if (licznik == nrLinii + 3)
			{
				stringstream geek(linia);
				geek >> rozmiar;
			}
			if (licznik == nrLinii + 4)
			{
				stringstream geek(linia);
				geek >> id_produktu;
			}
			if (licznik == nrLinii + 5)
			{
				model = linia;
			}
			if (licznik == nrLinii + 6)
			{
				istringstream(linia) >> daszek;
			}
			licznik++;
			plik.close();
		}
	}
	else cout << "Nie da sie otworzyc pliku!";
}

Chciałabym teraz wczytać z pliku n obiektów, a potem je wypisać. Problem w tym że nie mam pojęcia jak sprawić żeby uruchomił się konstruktor który pokazałam, zamiast tego domyślnego.

string Sciezka;
				cout << "Podaj sciezke do pliku" << endl;
				cin >> Sciezka;
				plik >> ilosc;
				Czapki* ktab = new Czapki[ilosc];
				for (int i = 0; i < ilosc; i++)
				{
					cout << "Czapka nr " << i + 1 << endl;
					ktab[i].wypisz();
					ktab[i].getNr(i);
				}

Macie może jakieś pomysły? Czy to w ogóle możliwe? Z góry bardzo dziękuję za rady.

komentarz 27 października 2020 przez tkz Nałogowiec (42,040 p.)
Dlaczego nie użyjesz vectora z standardu?
komentarz 27 października 2020 przez DzikieHarce Użytkownik (690 p.)
Tak wydawało mi się szybciej bezpieczniej, jako że nie znam się zbytnio na vectorach. Spróbowałabym jednak również z nimi, w jakiejś innej klasie.

2 odpowiedzi

0 głosów
odpowiedź 27 października 2020 przez Michałełe Nałogowiec (25,600 p.)
Czapki* ktab = new Czapki[ilosc];

W tej linijce alokujesz sobie nową tablicę i rozmiarze ilość - musisz jeszcze wywołać konstruktor. Nie mam możliwości teraz tego sprawdzić, ale to chyba powinno zadziałać:

Czapki* ktab = new Czapki[ilosc]("nazwa pliku");

Daj znać czy przechodzi :)

komentarz 27 października 2020 przez DzikieHarce Użytkownik (690 p.)
Niestety, próbowałam już tym sposobem. Wywala błąd: " nie można określić inicjatora new dla tablicy".
komentarz 27 października 2020 przez Michałełe Nałogowiec (25,600 p.)

Pod g++ mi przechodzi - no nic, zrób sobie to w pętli

    for (int i = 0; i < ilosc; ++i)
        ktab[i] = Czapki("nazwa pliku");

 

komentarz 27 października 2020 przez tkz Nałogowiec (42,040 p.)

@Michałełe, To jest niezgodne z standardem. Pod jakim gcc kompilujesz? Obecnie pod 10.2 nie przechodzi. 

komentarz 27 października 2020 przez DzikieHarce Użytkownik (690 p.)

@Michałełe,
 Teraz nie ma żadnych błędów, wczytuje się zadana ilość, ale wypisuje domyślne parametry z konstruktora bezargumentowego. Wydaje mi się jednak że ten błąd jest gdzieś indziej, bo wczytując dla innej klasy w której wczytywałam przez metodę, dzieje się tak samo. Dziękuję jednak za pomoc, bardzo się przydała :D

0 głosów
odpowiedź 27 października 2020 przez TOM_CPP Pasjonat (22,640 p.)

Najszybciej jest dodać metodę Czapki::load(...) odpowiedzialną za wczytywanie danych z pliku.

Czapki::Load( const string& Sciezka )
{
    /// kod przeniesiony z konstruktora
}

///////

Czapki* ktab = new Czapki[ilosc];

for (int i = 0; i < ilosc; i++)
{
      ktab[i].load(Sciezka);
}

for (int i = 0; i < ilosc; i++)
{
     cout << "Czapka nr " << i + 1 << endl;
     ktab[i].wypisz();
     ktab[i].getNr(i);
}

Pomyśl o wykorzystaniu std::vector zamiast wskaźników.

std::vector<Czapki> ktab(ilosc);

for (int i = 0; i < ilosc; i++)
{
      ktab[i].load(Sciezka);
}

lub bez dodawania metody load

std::vector<Czapki> ktab;

for (int i = 0; i < ilosc; i++)
{
      ktab.emplace_back(Sciezka);
}

 

komentarz 27 października 2020 przez DzikieHarce Użytkownik (690 p.)
Myślałam nad wektorami, ale trochę się ich bałam. W ramach praktyki wczytam twoim sposobem do innej klasy, wielkie dzięki za podpowiedź ;D Jeśli chodzi o użycie metody, już to robiłam, chciałam po prostu wypróbować innych metod wczytywania.

Podobne pytania

0 głosów
1 odpowiedź 1,685 wizyt
pytanie zadane 6 czerwca 2017 w PHP przez To Ja Początkujący (490 p.)
0 głosów
3 odpowiedzi 300 wizyt
pytanie zadane 27 listopada 2015 w C i C++ przez Tymek Baran Użytkownik (520 p.)
0 głosów
2 odpowiedzi 324 wizyt
pytanie zadane 31 października 2015 w C i C++ przez PrawyPrzemek Nowicjusz (200 p.)

93,717 zapytań

142,629 odpowiedzi

323,261 komentarzy

63,262 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...