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