Usuwanie wybranej linii w pliku

0

Piszę taki program, który ma zapisywać adresatów do pliku, a na podstawie podanego ID usunąć wybraną osobę. Problem w tym, że mój program nie usuwa tej osoby, którą chcę. Jeśli podam ID = 2 to usuwa osobę pierwszą i trzecią. Co mogę zmienić aby program usuwał to, co chcę?

#include <iostream>
#include <fstream>
#include <windows.h>
#include <cstdlib>
#include <sstream>
#include <vector>
#include <string>
 
using namespace std;
 
struct Adresat {
    string imie, nazwisko, nrTel, email, adres;
    int idAdresata = 0;
};
 
string konwertujIntNaString(int NrID) {
    ostringstream ss;
    ss << NrID;
    string str = ss.str();
 
    return str;
}
 
std::vector <Adresat> adresaci;
 
int dodajOsobeDoKsiazki (int iloscOsob = 0) {
 
    Adresat pomoc;
 
    string imie = " ", nazwisko = " ", nrTel = " ", email = " ", adres = " ";
    int idAdresata = iloscOsob + 1;
 
    std::string s = std::to_string(idAdresata);
 
    cout << "Podaj imie: ";
    cin >> imie;
    cin.sync();
    cout << "Podaj nazwisko: ";
    cin >> nazwisko;
    cin.sync();
    cout << "Podaj nr telefonu: ";
    getline(cin, nrTel);
    cin.sync();
    cout << "Podaj email: ";
    cin >> email;
    cin.sync();
    cout << "Podaj swoj adres: ";
    getline(cin, adres);
 
    pomoc.idAdresata = adresaci.size() + 1;
    pomoc.imie = imie;
    pomoc.nazwisko = nazwisko;
    pomoc.nrTel = nrTel;
    pomoc.email = email;
    pomoc.adres = adres;
 
    //dodaj osobe do wektora
    adresaci.push_back(pomoc);
 
 
    //zapisz do pliku
    fstream plikDoZapisu;
    plikDoZapisu.open("ksiazkaZAdresami.txt", ios::out | ios::app);
 
    if (plikDoZapisu.good() == true) {
        plikDoZapisu << pomoc.idAdresata << "|" << pomoc.imie << "|" << pomoc.nazwisko << "|" << pomoc.nrTel << "|" << pomoc.email << "|" << pomoc.adres << "|" << endl;
        plikDoZapisu.close();
    }
    else {
        cout << "Nie udalo sie otworzyc pliku";
        system("pause");
    }
    cout << "Osoba zostala dodana do ksiazki adresowej" << endl;
    system("pause");
 
    iloscOsob++;
 
    return iloscOsob + 1;
}
 
vector <Adresat> rozdzielDaneAdresatowNaPojedynczeDane (vector <Adresat> &adresaci, string liniaDoOdczytania, char znakPionowejKreski) {
    Adresat adresat;
    int nrLinii = 1;
    stringstream ss(liniaDoOdczytania);
    string pojedynczaDana = " ";
 
    while (getline(ss, pojedynczaDana, znakPionowejKreski)) {
        switch (nrLinii) {
        case 1:
            adresat.idAdresata = (atoi(pojedynczaDana.c_str()));
            break;
        case 2:
            adresat.imie = pojedynczaDana;
            break;
        case 3:
            adresat.nazwisko = pojedynczaDana;
            break;
        case 4:
            adresat.nrTel = pojedynczaDana;
            break;
        case 5:
            adresat.email = pojedynczaDana;
            break;
        case 6:
            adresat.adres = pojedynczaDana;
            break;
 
        }
        nrLinii++;
    }
    adresaci.push_back(adresat);
 
    return adresaci;
}
 
int wczytajPlikZDanymiAdresatow (vector <Adresat> &adresaci) {
    int idAdresata = 0;
    vector <string> pojedynczyKontakt;
    string liniaTekstu;
    int nrLinii = 1;
    int iloscOsob = 0;
    fstream plikDoOdczytu;
    string ostatniaOsobaWPliku = " ";
 
    plikDoOdczytu.open("ksiazkaZAdresami.txt", ios::in);
 
    if (plikDoOdczytu.good() == true) {
        while (getline(plikDoOdczytu, liniaTekstu)) {
            adresaci = rozdzielDaneAdresatowNaPojedynczeDane(adresaci, liniaTekstu, '|');
    }
    plikDoOdczytu.close();
 
}
 
void usunAdresata (vector <Adresat> &adresaci) {
    int wyborId;
    Adresat pomoc;
    char potwierdzenieWyboru;
    vector <string> tymczas;
    string usuwanaLinia;
    vector <Adresat> ::iterator itr = adresaci.begin();
    vector <Adresat> ::iterator itrEnd = adresaci.end();
    int usuwanaLiniaWInt;
 
    cout << "Podaj id adresata, ktorego chcesz usunac:";
    cin >> wyborId;
    for (itr; itr != itrEnd; ++itr) {
        if (itr->idAdresata == wyborId) {
            cout << "Czy na pewno chcesz usunac tego adresata? Kliknij t: " << endl;
            cin >> potwierdzenieWyboru;
            if (potwierdzenieWyboru == 't') {
                //otwarcie pliku starego i usuniecie adresata
                ifstream in("ksiazkaZAdresami.txt");
                while (getline(in, usuwanaLinia)) tymczas.push_back(usuwanaLinia);
                in.close();
                //zapisanie pliku bez danego adresata
                ofstream out ("ksiazkaZAdresami.txt");
                for (int pozycjaWektora = 0; pozycjaWektora < adresaci.size(); pozycjaWektora++) {
                    //if (pozycjaWektora + 1 != wyborId)
                    tymczas.erase(tymczas.begin() + pozycjaWektora);
                        out << tymczas[pozycjaWektora] << endl;
                }
                out.close();
                cout << "Kontakt zostal usuniety" << endl;
                Sleep(800);
            }
        }
 
    }
}
 
int main() {
 
    int liczbaZapisanychOsob = 0;
    char twojWybor;
 
    liczbaZapisanychOsob = wczytajPlikZDanymiAdresatow (adresaci);
 
    while (1) {
        system("cls");
        cout << "Witaj w ksiazce adresowej!" << endl;
        cout << "Wybierz opcje: " << endl;
        cout << "1. Dodaj adresata" << endl;
        cout << "5. Usun adresata" << endl;
        cout << "6. Edytuj adresata" << endl;
        cout << "9. Zakoncz program" << endl;
 
        cin >> twojWybor;
 
        if (twojWybor == '1') {
            dodajOsobeDoKsiazki(liczbaZapisanychOsob);
        }  else if (twojWybor == '5') {
            usunAdresata(adresaci);
        } else if (twojWybor == '9') {
            exit(0);
        }
    }
    return 0;
}
0

przeanalizuj dokłądnie tę pętlę:

for (int pozycjaWektora = 0; pozycjaWektora < adresaci.size(); pozycjaWektora++) {
  //if (pozycjaWektora + 1 != wyborId)
  tymczas.erase(tymczas.begin() + pozycjaWektora);
  out << tymczas[pozycjaWektora] << endl;
}

Przy każdej iteracji popatrz jak wygląda wektor tymczas

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