• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Usuwanie wybranej linii w pliku

Object Storage Arubacloud
0 głosów
490 wizyt
pytanie zadane 11 października 2020 w C i C++ przez magda_19 Gaduła (3,080 p.)

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)) {
            //cout << liniaTekstu[2];
            adresaci = rozdzielDaneAdresatowNaPojedynczeDane(adresaci, liniaTekstu, '|');


            //adresaci.push_back(pojedynczyKontakt[0], pojedynczyKontakt[1], pojedynczyKontakt[2], pojedynczyKontakt[3], pojedynczyKontakt[4], pojedynczyKontakt[5], pojedynczyKontakt[6]);
        }
        //ostatniaOsobaWPliku = liniaTekstu;

        /* if (ostatniaOsobaWPliku != " ") {
             idAdresata = pobierzIdDlaOstatniejOsobyWPliku(liniaTekstu, '|');
             return idAdresata;
         }
         else
             idAdresata = 0;*/
    }
    plikDoOdczytu.close();

//    return adresaci;

}

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;
}

 

1 odpowiedź

0 głosów
odpowiedź 12 października 2020 przez j23 Mędrzec (194,920 p.)
wybrane 12 października 2020 przez magda_19
 
Najlepsza

A nie wystarczy po prostu:

for (auto i = adresaci.begin(); i != adresaci.end(); ++i) {
	if (i->idAdresata == wyborId) {
		adresaci.erase(i);
		break; // <--- zakładając, że każdy adresat ma swój unikalny ID
	}
}

std::ofstream out("ksiazkaZAdresami.txt");
for (auto &a : adresaci) {
	out << a.idAdresata << '\n';
	out << a.imie << '\n';
	out << a.nazwisko << '\n';
	out << a.nrTel << '\n';
	out << a.email << '\n';
	out << a.adres << '\n';
}

???

Problem jaki tu widzę to nadawanie ID w oparciu o ilość wpisów w adresaci - ta może być wielokrotnie taka sama: dodasz 5 wpisów, usuniesz jeden np. z początku, dodasz nowy i będziesz mieć dwa wpisy o ID 5. Powinnaś mieć zmienną, która trzyma najwyższą wartość ID, jaka jest w bazie. I przy każdym dodaniu nowej wartości zwiększać ją o jeden.

komentarz 12 października 2020 przez magda_19 Gaduła (3,080 p.)
Dzięki,  teraz już działa. Mógłbyś powiedzieć jaka jest różnica miedzy tym interaratorem, który ja miałam, a Twoim?
komentarz 12 października 2020 przez j23 Mędrzec (194,920 p.)
Różnica jest żadna, po prostu inaczej to zapisałem.

Podobne pytania

0 głosów
1 odpowiedź 286 wizyt
pytanie zadane 7 grudnia 2016 w C i C++ przez niezalogowany
0 głosów
0 odpowiedzi 272 wizyt
pytanie zadane 7 października 2020 w C i C++ przez magda_19 Gaduła (3,080 p.)
0 głosów
0 odpowiedzi 412 wizyt
pytanie zadane 27 lutego 2018 w Java przez niezalogowany

92,687 zapytań

141,598 odpowiedzi

320,087 komentarzy

62,047 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

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!

...