• 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
457 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ź 277 wizyt
pytanie zadane 7 grudnia 2016 w C i C++ przez niezalogowany
0 głosów
0 odpowiedzi 266 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 395 wizyt
pytanie zadane 27 lutego 2018 w Java przez niezalogowany

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...