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

Usuwanie danych z pliku

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

Mój program zapisuje dane do pliku i jedną z funkcji jest usuwanie adresata. Po wpisaniu id osoby powinna być ona usunięta z pliku. Jak na razie mój program w funkcji usunAdresata nadpisuje plik, po czym linia adresaci.erase (itr) powinna go usuwać, a tego nie robi. Program usuwa wybrana osobe, ale tez nadpisuje plik. Jak się pozbyć tego nadpisywania?

#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++;
    pomoc.idAdresata++;

    return iloscOsob + 1;
}

vector <Adresat> rozdzielDaneAdresatowNaPojedynczeDane (vector <Adresat> &adresaci, string liniaDoOdczytania, char znakPionowejKreski) {
    Adresat adresat;
    int nrLinii = 1;
    //int idAdresata = 0;
    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]);
        }

    }
    plikDoOdczytu.close();

}

void aktualizujPoUsusnieciu (Adresat pomoc) {
    fstream plik;
    plik.open("ksiazkaZAdresami.txt", ios::out);

    if (plik.good() == true) {
        for (int pozycjaWektora = 0; pozycjaWektora < adresaci.size(); pozycjaWektora++) {
            plik << adresaci[pozycjaWektora].idAdresata << "|" << adresaci[pozycjaWektora].imie << "|" << adresaci[pozycjaWektora].nazwisko << "|" << adresaci[pozycjaWektora].nrTel << "|" << adresaci[pozycjaWektora].email << "|" << adresaci[pozycjaWektora].adres << "|" << endl;
        }
        plik.close();

    }

}

int usunAdresata (vector <Adresat> &adresaci) {
    wczytajPlikZDanymiAdresatow(adresaci);
    int wybraneID;
    char potwierdzenieUsuniecia;
    vector <Adresat> ::iterator itr = adresaci.begin();
    vector <Adresat> ::iterator itrEnd = adresaci.end();

    cout << "Podaj id adresata, ktorego chcesz usunac:";
    cin >> wybraneID;
    for (itr; itr != itrEnd; ++itr) {
        if (itr->idAdresata == wybraneID) {
            cout << "Czy na pewno chcesz usunac tego adresata? Jesli tak, kliknij t";
            cin >> potwierdzenieUsuniecia;
            if (potwierdzenieUsuniecia == 't') {
                //aktualizujPoUsusnieciu(*itr);
                adresaci.erase (itr);
                aktualizujPoUsusnieciu(*itr);
                cout << "Kontakt zostal usuniety";
                Sleep(800);
                return 0;
            }
        }
    }

}

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 << "5. Usun 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;
}

 

komentarz 7 października 2020 przez tkz Nałogowiec (42,000 p.)
Nie wiem, czy to jedyny problem, ale zwróć uwagę w jakim trybie otwierasz plik w aktualizujPoUsusnieciu().

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 458 wizyt
pytanie zadane 11 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
0 głosów
2 odpowiedzi 291 wizyt
pytanie zadane 3 kwietnia 2020 w C i C++ przez FaloY Bywalec (2,180 p.)

92,556 zapytań

141,404 odpowiedzi

319,562 komentarzy

61,942 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!

...