• 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++

Object Storage Arubacloud
0 głosów
134 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,000 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,000 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,098 wizyt
pytanie zadane 6 czerwca 2017 w PHP przez To Ja Początkujący (490 p.)
0 głosów
3 odpowiedzi 153 wizyt
pytanie zadane 27 listopada 2015 w C i C++ przez Tymek Baran Użytkownik (520 p.)
0 głosów
2 odpowiedzi 143 wizyt
pytanie zadane 31 października 2015 w C i C++ przez PrawyPrzemek Nowicjusz (200 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...