pliki i wektory

ER
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 13 lat
  • Postów:16
0

Witam. mam mały problem, ponieważ potrzebuję zrobić tak aby funkcja odczytywała mi dane z pliku i wpisywała je na koniec wektora. czyli jak np. w wektorze mam "a" w pliku mam "bc" to po wwczytaniu i wpisaniu ma być "abc". Mam taki kod:

Kopiuj
    
string line;
ifstream plik;
plik.open("cos.txt");
while(!plik.eof())
{
getline(plik,line);
FC.push_back(line);
}
plik.close(); 

I wyskakuje mi blad:
|143|error: no matching function for call to 'std::vector<Klub, std::allocator<Klub> >::push_back(std::string&)'|
Linia 143 to:

Kopiuj
plik.close();

Nie mam pojecia jak to zrobic... ;/ proszę pomóżcie

43
FC.push_back(Klub(line)); A dalej niech się Klub martwi.
Endrju
  • Rejestracja:około 22 lata
  • Ostatnio:prawie 2 lata
0

Zmienna FC jest typu std::vector<Klub>. Czyli jest to std::vector, który przechowuje elementy typu Klub. Jak chcesz do takiego pojemnika wsadzić std::string? Kompilator właśnie to mówi.

Co o jest Klub? Rozumiem, że ta klasa ma jakieś pole, które jest typu std::string i to tam chcesz wpisać ten tekst z pliku? W tej pętli musisz tworzyć nowy obiekt tego typu, ustawiać ten tekst i dopiero potem robić push_back. Innym rozwiązaniem jest konstruktor, który ma jeden wymagany argument typu std::string i który nie jest explicit.


"(...) otherwise, the behavior is undefined".
ER
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 13 lat
  • Postów:16
0

czyli z tego co rozumiem mam stworzyć nowa zmienna "tymczasowa" z tego Klub i do niej dopisywać dopiero string? czyli np
Klub cos i do tego "cos" mam dopisywać ten string a potem tego "cos" dać do wektora?

Klub to jest struktura:

Kopiuj
struct Klub
{
    string nazwaKlubu;
    string kraj;
    string trener;
    string trofea;
    int rokZalozenia;
};

i chce aby kazde pole z pliku bylo wpisane do innej zmiennej. tak samo jak robie podczas wpisywania do pliku

edytowany 2x, ostatnio: EneR
0

Pokaż jak wygląda jedna linijka z pliku z danymi.

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:20 dni
0

Wystarczy że dodasz do struktury Klub konstruktor:
Klub::Klub(string init)
{
// tu jakoś rozdzielić ten napis na składowe
}
Po dodaniu takiego konstruktora może się pojawić błąd związany z brakiem konstruktora domyślnego, więc dodać też:
Klub::Klub() {}


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
ER
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 13 lat
  • Postów:16
0

to z tym konstruktorem do struktury nie dziala bądź ja coś źle robię. jak daje tak jak powiedziałeś:

Kopiuj
struct Klub::Klub(string init)
{
    string nazwaKlubu;
    string kraj;
    string trener;
    string trofea;
    int rokZalozenia;
}; 

to wyskakuje mi strasznie dużo błędów związanych właśnie z tą strukturą. Te błędy są przy wywoływaniu jej

jedna linijka z pliku z danymi to:
Nazwa klubu: FCB
a całość jednego wpisu wygląda tak:

Kopiuj
Nazwa klubu: FCB
kraj: Hiszpania
Trener: portoryko
Trofea: 18
Rok zalozenia:1800
--------------

dobra poradzilem sobie z dopisywanie do wektora danych z pliku.
zrobilem to tak:

Kopiuj
    Klub dr;
    ifstream plik;
    plik.open("baza.txt");
    while(!plik.eof())
    {
        getline(plik,dr.nazwaKlubu);
        getline(plik,dr.kraj);
        getline(plik,dr.trener);
        getline(plik,dr.trofea);
        getline(plik,dr.rokZalozenia);
        FC.push_back(dr);
    }
    plik.close();
edytowany 1x, ostatnio: EneR
0
Kopiuj
Class Klub
{
    public:
    string nazwaKlubu;
    string kraj;
    string trener;
    string trofea;
    int rokZalozenia;
    Klub (string a, string b, string c, string d)

}; 
.................................
string line1,line2,line3,line4;
vector <Klub> FC;
ifstream plik;
plik.open("cos.txt");
while(!plik.eof())
{
      getline(plik,line1);
      getline(plik,line2);
      getline(plik,line3);
      getline(plik,line4);
      getline(plik,line5);
      Klub x(line1,line2,line3,line4,line5);
      FC.push_back(x);
}
plik.close();
0

Tam w konstruktorze już kombinuj sam :P

ER
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 13 lat
  • Postów:16
0

kurde ;/ zauważyłem teraz inny problem ;/ jak wpisze do pliku to wygląda to tak:

Kopiuj
Nazwa klubu: fc1
kraj: fc1
Trener: fc1
Trofea: fc1
Rok zalozenia: fc1

a jak użyje tego dopisywania do wektora w wyświetle to w konsoli to nagle wyskakują mi podwójnie

Kopiuj
Nazwa klubu:Nazwa klubu: fc1
kraj:kraj: fc1
Trener:Trener: fc1
Trofea:Trofea: fc1
Rok zalozenia:Rok zalozenia: fc1

i jeszcze często gdzieś urywa mi dane i zastępuje je "---------" nie wiem co jest z tym źle ;/

tubbs
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:13
0

wczytuje wszędzie fc1, bo w pętli while do każdego line wczytuje ten sam wyraz: fc1 (dopiero kolejne przejście pętli to wczytywanie nowego wyrazu).
spróbuj zrobić jakoś tak:


Class Klub
{
public:
string nazwaKlubu;
string kraj;
string trener;
string trofea;
int rokZalozenia;
Klub (string 1, string 2, string 3, string 4)

};
.................................
string line1,line2,line3,line4;
vector <Klub> FC;
ifstream plik;
plik.open("cos.txt");
int i = 0;
while(!plik.eof())
{
getline(plik,line i); //albo: line[i]
Klub x(line i);
FC.push_back(x);
}
plik.close();


edit. moze tez zalezec od tego w jakiej formie masz napisany plik. spróbuj też ew. wczytywać nie getlinem a: plik >> line
mam nadzieję, że trochę pomogłem, nie dam głowy czy to jest dobrze

tubbs
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:13
0

sorry, nie: Klub x(line i), tylko: Klub x(string i)

ER
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 13 lat
  • Postów:16
0

nie chodzi oto ze wczytuje mi caly czas to samo. Po prostu ja tak wpisalem. Zapisywanie do pliku jest dobre. ale juz wiem dlaczego mi zle wyswietlalo jak dodawalem to do wektora ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.