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

Aktualizowanie danych w pliku

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

Piszę książkę adresową. Mój program ma zapisywać dane adresatów do pliku, po czym chcę aby je edytował. Jak mogę edytować dane, tak aby w pliku były te zaktualizowane? Trzeba stwarzać nowy plik (taki tymczasowy) czy można w tym samym? Mam funkcję stworzNowyPlikZZaktualizowanymiKontaktami, ale po kompilacji wyrzuca mi błąd.

#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("kontakty.txt", ios::out | ios::app);

    if (plikDoZapisu.good() == true) {
        //plikDoZapisu.write(( char * ) & adresaci[ 0 ], adresaci.size() * sizeof( string ) );

        plikDoZapisu << pomoc.idAdresata << "|" << pomoc.imie << "|" << pomoc.nazwisko << "|" << pomoc.nrTel << "|" << pomoc.email << "|" << pomoc.adres << "|" << endl;
        plikDoZapisu.close();

        //cout << adresat.idAdresata;

    } 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;
        //idOsoby = atoi(pomocnicza.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++;
    }
    //if() {
    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("kontakty.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 wyszukajOsobePoImieniu () {
    string imie;
    int iloscOsob = 0;
    vector <Adresat>::iterator itr = adresaci.begin();
    cout << "Podaj imie, ktore chcesz wyszukac: ";
    cin.sync();
    cin >> imie;
    cin.sync();

    for (itr; itr != adresaci.end(); itr++) {
        if(itr -> imie == imie) {
            cout << "Znalazlem osobe o takim imieniu";
            iloscOsob++;
        } else {
            iloscOsob++;
        }
    }
}

void wyszukajOsobePoNazwisku (vector <Adresat> adresaci) {
    string nazwisko;
    int iloscOsob = 0;
    //::iterator itr = adresaci.begin();
    cout << "Podaj nazwisko, ktore chcesz wyszukac: ";
    cin.sync();
    cin >> nazwisko;
    cin.sync();
    int i = 0;

    while (i < adresaci.size()) {
        if(adresaci[i].nazwisko == nazwisko) {
            cout << "Znalazlem osobe o takim nazwisku";
            i++;
        } else {
            i++;

        }
    }
}

void wyswietlWszystkieKontakty () {
    vector <Adresat>::iterator itr = adresaci.begin();

    for (itr; itr != adresaci.end(); itr++) {
        cout << "ID: " << itr->idAdresata << endl;
        cout << "Imie: " << itr->imie << endl;
        cout << "Nazwisko: " << itr->nazwisko << endl;
        cout << "Nr tel: " << itr->nrTel << endl;
        cout << "Adres email: " << itr->email << endl;
        cout << "Adres zamieszkania: " << itr->adres << endl;
        Sleep(1500);
    }

}


void stworzNowyPlikZZaktualizowanymiKontaktami () {
    Adresat obecnyKontakt;
    string linia;
    char wybor;
    fstream staryPlik, nowyPlik;
    vector <char> pomoc;
    staryPlik.open("b.txt", ios::in);
    nowyPlik.open("tymczasowy.txt", ios::out | ios::app);

    if (staryPlik.good() == true) {
        while (getline(staryPlik, linia)) {
            pomoc.clear();
            for (int i = 0; linia[i] != '|'; i++) {
                pomoc.push_back(linia[i]);
            }
            if (atoi(pomoc.c_str()) != obecnyKontakt.idAdresata) {
                nowyPlik << linia << endl;
            }
            else if (wybor == '6') {
                nowyPlik << obecnyKontakt.imie;
                nowyPlik << obecnyKontakt.nazwisko;
                nowyPlik << obecnyKontakt.nrTel;
                nowyPlik << obecnyKontakt.email;
                nowyPlik << obecnyKontakt.adres;
            }
        }
            staryPlik.close();
            remove (b.c_str());
            nowyPlik.close();
            rename (tymczasowy.c_str(), b.c_str());

    }



}

char wybierzOpcjeZMenuEdycjiUzytkownika () {
    system("cls");
    char wyborOpcji;
    string noweImie, noweNazwisko, nowyNrTel, nowyEmail, nowyAdres;
    int IdAdresata;
    Adresat pomoc;
    int wyborId;
    vector <Adresat>::iterator itr = adresaci.begin();
    vector <Adresat> adresaci;

    wczytajPlikZDanymiAdresatow(adresaci);

    //for (int i = 0; i < adresaci.size(); i++) {
    while (itr != adresaci.end()) {
        cout << "Podaj id uzytkownika, ktorego dane maja byc edytowane: ";
        cin >> wyborId;

        konwertujIntNaString(wyborId);

        for (int i = 0; i < adresaci.size(); i++) {
            if (adresaci[i].idAdresata == wyborId) {
                cout << "Imie: " << adresaci[i].imie << endl;
                cout << "Nazwisko: " << adresaci[i].nazwisko << endl;
                cout << "Nr tel: " << adresaci[i].nrTel << endl;
                cout << "Adres email: " << adresaci[i].email << endl;
                cout << "Adres zamieszkania: " << adresaci[i].adres << endl;
                cout << endl;
            }
        }
            //wybierzIDOsobyDoEdycji (IdAdresata);
        cout << "Wybierz konkretna dana do edycji: " << endl;
        cout << endl;
        cout << "1 - imie" << endl;
        cout << "2 - nazwisko" << endl;
        cout << "3 - numer telefonu" << endl;
        cout << "4 - email" << endl;
        cout << "5 - adres" << endl;
        cout << "6 - powrot do menu glownego" << endl;

        cin >> wyborOpcji;
        if (wyborOpcji == '1') {
            cout << "Podaj nowe imie: ";
            cin.sync();
            cin >> noweImie;
            for (int i = 0; i < adresaci.size(); i++) {
                adresaci[i].imie = noweImie;
            }
        } else if (wyborOpcji == '2') {
            cout << "Podaj nowe nazwisko: ";
            cin.sync();
            cin >> noweNazwisko;
            for (int i = 0; i < adresaci.size(); i++) {
                adresaci[i].nazwisko = noweNazwisko;
            }
            //pomoc.nazwisko = noweNazwisko;
        } else if (wyborOpcji == '3') {
            cout << "Podaj nowy nr telefonu: ";
            cin.sync();
            getline(cin, nowyNrTel);
            pomoc.nrTel = nowyNrTel;
        } else if (wyborOpcji == '4') {
            cout << "Podaj nowy adres email: ";
            cin.sync();
            cin >> nowyEmail;
            pomoc.email = nowyEmail;
        } else if (wyborOpcji == '5') {
            cout << "Podaj nowy adres zamieszkania: ";
            cin.sync();
            getline (cin, nowyAdres);
            pomoc.adres = nowyAdres;
        } else if (wyborOpcji == '6') {
            break;
        }
        stworzNowyPlikZZaktualizowanymiKontaktami();
        cout << "Zmiana zostala zapisana" << endl;
        Sleep(800);
        return wyborOpcji;
    }
    itr++;
        }

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 << "2. Wyszukuj po imieniu" << endl;
        cout << "3  Wyszukuj po nazwisku" << endl;
        cout << "4. Wyswietl wszystkich adresatow" << 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 == '2') {
            wyszukajOsobePoImieniu();
        } else if (twojWybor == '3') {
            wyszukajOsobePoNazwisku(adresaci);
        } else if (twojWybor == '4') {
            wyswietlWszystkieKontakty();
        } else if (twojWybor == '5') {
            //usunAdresata();
        } else if (twojWybor == '6') {
            wybierzOpcjeZMenuEdycjiUzytkownika();
        } else if (twojWybor == '9') {
            exit(0);
        }
    }
    return 0;
}

 

 

komentarz 2 października 2020 przez j23 Mędrzec (194,920 p.)

Po co rozdzielDaneAdresatowNaPojedynczeDane zwraca wektora, skoro dodaje nowy wpis do tego, podanego w parametrze?

1 odpowiedź

+1 głos
odpowiedź 2 października 2020 przez Oscar Nałogowiec (29,320 p.)
Skoro i tak trzymasz w programie całą tablicę adresatów to po prostu nadpisuj cały plik aktualnymi danymi. Modyfikacja istniejącego pliku w formacie tekstowym jest raczej niepraktyczna - masz zmienną wielkość rekordu więc i tak trzeba by było poprzesuwać dane co oznacza przepisanie sporej części pliku.
komentarz 6 października 2020 przez magda_19 Gaduła (3,080 p.)
Dzięki za komentarz, udało się. A wiesz może jak usunąć jakieś dane z pliku? Czy teraz trzeba tworzyć plik tymczasowy?

Podobne pytania

0 głosów
0 odpowiedzi 140 wizyt
0 głosów
1 odpowiedź 461 wizyt
pytanie zadane 11 października 2020 w C i C++ przez magda_19 Gaduła (3,080 p.)
0 głosów
1 odpowiedź 1,289 wizyt
pytanie zadane 11 stycznia 2019 w C i C++ przez kamyk2 Początkujący (420 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

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

...