Witam. Uczę się obiektówki. Zadaniem programu jest sworzenie listy z danymi piłkarzy.
Pojawił się problem już na sam koniec a mianowicie:
Chcę otworzyć plik i odczytać z niego dane piłkarzy a następnie dodać je na listę.
Plik txt wygląda tak:
Jan Kowalski, lat: 22, napastnik
I nie wiem w jaki sposób przeciążyć teraz operator aby poprawnie odczytał on z pliku dane. Oczywiście ten program na pewno dało by się zrobić bez użycia operatora przeciążenia, ale ja chcę akurat w taki sposób :/
Cały program:
#include<iostream>
#include <string>
#include <process.h>
#include <list>
#include <cstddef>
#include <fstream>
#include<cstdlib>
using namespace std;
struct Gracz { // struktura przechowuje dane piłkarza
string imie;
string nazwisko;
int wiek;
string pozycja;
friend istream & operator >>(istream & is, Gracz & Gracz) { //przeciążenie wypełni mi pola struktury
cout << "\nImie: "; is >> Gracz.imie;
cout << "Nazwisko: "; is >> Gracz.nazwisko;
cout << "Wiek: "; is >> Gracz.wiek;
cout << "Pozycja:"; is >> Gracz.pozycja;
return is;
}
};
class Druzyna { //lista jest znana i zaprzyjaźniona dzięki strukturze ze wszysktimi metodami i wypełni mi całą klasę
list < Gracz > team;
public:
void dodaj_gracza() {
Gracz gracz; // lokalna deklaracja obiektu
cin >> gracz; // użycie przeciążonego operator>> ze struktury (wypełnia pola struktury)
team.push_back(gracz);
}
friend ostream & operator <<(ostream & os, const Druzyna & Druzyna) {
for (auto const & elem : Druzyna.team) {
os << elem.imie << ' ' << elem.nazwisko << ", " << "lat: "
<< elem.wiek << ", " << elem.pozycja << endl;
}
return os;
}
};
int main()
{
Druzyna druzyna{}; // deklaracja obiektu klasy (z kontenerem)
int flaga = 0;
char switchOpcja{};
do {
cout << "1. Dodaj pilkarza" << endl;
cout << "2. Pokaz liste" << endl;
cout << "3. Zapisz do pliku" << endl;
cout << "4. Wczytaj z pliku" << endl;
cout << "5. Zakoncz" << endl;
cin >> switchOpcja;
switch (switchOpcja) {
case '1'://1.dodaj pilkarza
{
druzyna.dodaj_gracza();
flaga = 1;
break;
}
case '2'://2.pokaz liste
{
if (flaga == 0) cout << "Lista jest pusta kolego. Najpierw kogos dodaj" << endl;
cout << druzyna << '\n';
break;
}
case '3'://3.zapisz do pliku
{
if (flaga == 0) cout << "Chlopie ! Co TY chcesz zapisac skoro nie stworzyles listy ?" << endl;
fstream plik;
plik.open("lista.txt", ios::out | ios::app);
plik << druzyna;
plik.close();
cout << "\nWykonano zapis do pliku\n"<<endl;
break;
}
case '4'://otworz z pliku
{
ifstream plik;
plik.open("lista.txt");
if (plik.good() == false) { cout << "Plik nie istnieje\n" << endl; break; }
string slowo;
while (true)
{
flaga = 1;
if (plik.good())
{
}
else
break;
} //while
plik.close();
}
break;
case '5'://zakoncz
{cout << "Koniec.\n";
break;
}
default:
{
cerr << "Jakis nieokreslony przypadek.\n";
}
}
} while (switchOpcja != '5');
system("PAUSE");
return 0;
}