• 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
272 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ź 490 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 412 wizyt
pytanie zadane 27 lutego 2018 w Java przez niezalogowany
0 głosów
2 odpowiedzi 329 wizyt
pytanie zadane 3 kwietnia 2020 w C i C++ przez FaloY Bywalec (2,180 p.)

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!

...