Witam. Napotkałem kolejny problem odnośnie zapisywania wielu elementow do plikow z zmienionymi indeksami np Osoba0.txt, Osoba1.txt itd.
Opis Programu
Program powinien dodawać użytkowników, a po ponownym uruchomieniu wczytać ich z pliku i móc dodać nowych.
1 Uruchomienie zapisuje "Jan", "Dawid", "Mateusz"
2 Uruchomienie zapisuje "Jan", "Dawid", "Mateusz", "Jan", "Dawid", "Mateusz".
itd...
Istotne jest aby kolejne dodania nie nadpisywały poprzednich. Tak niestety się dzieje teraz w programie.
Próbowałem na wiele sposobów. dodawać id++ w Konstruktorach operatorach, przypisania, odejmować w destruktorze. Zawsze coś było nie tak.
Pytania:
- Do Klasy Osoba zaimplementowałem funkcje ZapiszDoPliku() i WczytajZPliku(). Czy to mądre posunięcie?
- W jaki sposób poradzić sobie z głównym problemem wątku ?
Siedzę nad tym od 10 godziny :)...
Program
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
// Konwersja
string intToStr(int n)
{
string tmp;
if(n < 0)
{
tmp = "-";
n = -n;
}
if(n > 9)
tmp += intToStr(n / 10);
tmp += n % 10 + 48;
return tmp;
}
//********************************************************************************************************************
class Osoba
{
public:
static int id;
string imie; // dla uproszczenia publicznie
Osoba(string imie): imie(imie)
{
id++;
cout << "Konstruktor param. id:" << id << endl;
}
Osoba()
{
// cout << "Konstruktor domyslny id:" << id << endl;
//id++;
}
~Osoba()
{
// cout << "Destruktor id:" << id << endl;
// id--;
}
void ZapiszDoPliku()
{
fstream plik;
string nazwa = "Osoba" + intToStr(id) + ".txt";
plik.open(nazwa.c_str(), ios::out);
plik << imie;
plik.close();
}
bool WczytajZPliku(int id)
{
fstream plik;
string linia;
string nazwa = "Osoba" + intToStr(id) + ".txt";
plik.open(nazwa.c_str(), ios::in);
if(plik.good())
{
cout<< "Wczytuje: " << nazwa << endl;
while(getline(plik,linia))
imie = linia; // jest tylko jeden przypadek dla tego programu,
return true;
plik.close();
}
else
cout <<"Wczytano Osob: " << id << endl;
plik.close();
return false;
}
};
int Osoba::id =-1; // konstruktor zwieksza++, wiec pliki beda zapisane od 0
//********************************************************************************************************************
void WczytajListeOsobZPliku(vector<Osoba> &listaOsob)
{
Osoba o;
for(int i=0; ; i++) // nie wiem ile jest plikow osob wiec wykonuje az znajdzie ostatatni z id
if(o.WczytajZPliku(i)) // Gdy uda sie wczytac
listaOsob.push_back(o); // dodaj na liste osobe uzupelniona imieniem
else
break; // jezeli nie znaleziono pliku o nazwie z tym indeksem opusc petke
}
//********************************************************************************************************************
void WypiszListeOsob(vector<Osoba> &listaOsob)
{
for(int i=0; i<listaOsob.size(); i++)
cout << listaOsob[i].imie << endl;
}
//********************************************************************************************************************
void DodajOsobeDoListy(vector<Osoba> &listaOsob)
{
string imiona[] = {"Jan", "Dawid", "Mateusz"};
for(int i=0; i<3; i++) // dodaj osoby
{
Osoba o(imiona[i]);
listaOsob.push_back(o);
listaOsob[i].ZapiszDoPliku();
cout << "Osoba Dodana!" << endl;
}
}
//********************************************************************************************************************
int main()
{
vector<Osoba> listaOsob;
WczytajListeOsobZPliku(listaOsob); //Przed rozpoczeciem wczytujemy z pliku
WypiszListeOsob (listaOsob); // wypisz osoby wczytane z pliku
DodajOsobeDoListy(listaOsob);
WypiszListeOsob (listaOsob); // wypisz osoby wczytane z pliku i nowe dodane
return 0;
}