Wywołanie metody w wektorze

0

Witam,
Piszę książkę adresową obiektowo. Program ma funkcjonalność, która pozwala na zmianę hasła użytkownikowi. Chcę zmienione hasło zapisać w pliku. Czyli do klasy PlikZUzytkownikami chcę dodać metodę zaktualizujHaslo() i wowołać ją po zmianie hasła w wektorze. Próbuję to zaimplementować w moim kodzie, ale mam błąd w tej metodzie. Wstawiam również link do github, gdzie znajduje się cały program: https://github.com/Magda19P/AddressBook-object_oriented

void PlikZUzytkownikami :: zaktualizujHaslo()
{
    string noweHaslo;
    fstream plikTekstowy;
    vector <Uzytkownik> uzytkownicy;
    plikTekstowy.open(pobierzNazwePliku().c_str(), ios::out);

    if (plikTekstowy.good() == true)
    {
        plikTekstowy << uzytkownicy.push_back(noweHaslo); //tu próbuję zapisać do pliku
    }
    else
    {
        cout << "Nie mozna otworzyc pliku " << nazwaPlikuZUzytkownikami << endl;
    }
    plikTekstowy.close();

}
void UzytkownikMenedzer :: zmianaHaslaZalogowanegoUzytkownika() {
    string noweHaslo = "";
    cout << "Podaj nowe haslo: ";
    cin >> noweHaslo;

    for (int i = 0; i < uzytkownicy.size(); i++) {
        if (uzytkownicy[i].pobierzId() == idZalogowanegoUzytkownika) {
            uzytkownicy[i].ustawHaslo(noweHaslo);
            cout << "Haslo zostalo zmienione." << endl << endl;
            system("pause");
        }
    }
    plikZUzytkownikami.zaktualizujHaslo(noweHaslo);
}
0

Ale gdzie w zasadzie masz zapis do pliku? Bo póki co tylko go otwierasz.

void PlikZUzytkownikami :: zaktualizujHaslo()
{
    string noweHaslo; //pusty string
    fstream plikTekstowy;  //mozna otworzyc od razu w konstruktorze
    vector <Uzytkownik> uzytkownicy; //pusty wektor zawierajacy typ Uzytkownicy
    plikTekstowy.open(pobierzNazwePliku().c_str(), ios::out); //od C++11 nie trzeba c_str robic, ale to drobnostka

    if (plikTekstowy.good() == true)
    {
        uzytkownicy.push_back(noweHaslo); //WTF? konwersja haslo->uzytykownik? Co najmniej dziwne a raczej bledne?
    }
    else
    {
        cout << "Nie mozna otworzyc pliku " << nazwaPlikuZUzytkownikami << endl;
    }
    plikTekstowy.close(); //destruktor sam go zakmnie

}
2

Oj Siostro, źle się do tego zabrałaś. Takie wywołanie:

plikTekstowy << uzytkownicy.push_back(noweHaslo); //tu próbuję zapisać do pliku

jak zadziała to dopisze hasło na końcu pliku, a nie podmieni je dla jakiegoś konkretnego użytkownika. Trzeba dopracować koncepcję.
Podejrzewam, iż do pliku tekstowego zapisujesz, a przynajmniej chcesz zapisywać, coś w taki deseń:
nazwa_użytkownika
hasło_użytkownika
jakieś_dane, np adres, telefon, imię, nazwisko itd
to w takiej sytuacji trzeba przerobić metodę zaktualizujHaslo() na coś takiego:

bool zaktualizujHaslo(const std::string &nazwaUzytkownika)
{
//i teraz działanie w krokach
//1. znaleźć w pliku dane użytkownika o podanej nazwie, i wyeksportować je do obiektu Uzytkownik
możliwe, iż przydadzą się ekstra metody long int znajdzUzytkownikaWPliku(const std::string &nazwaUzytkownika)
Uzytkownik pobierzDaneUzytkownikaZPliku(long int offset), i ewentualnie wersja przeładowana przyjmująca nazwę użytkownika, i wołająca znajdzUzytkowniaWPliku() wewnętrznie

//2. w tymże obiekcie użytkownik podmienić hasło na nowe

//3. stworzyć funkcję void zapiszUzytkownikaDoPliku(const Uzytkownik &uzytkownik) która będzie działać następująco
- wywoła wpierw znajdzUzytkownikaWPliku(), i jeśli znajdzie to zapamiętuje offset, i kasuje znalezionego użytkownika
- jak nie znajdzie, to offset ma pokazać na koniec pliku
- zapisuje dane przekazanego w parametrze użytkownika do pliku
}

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