Unikalne ID [c++]

0

witam mam taki maly problem pisze projekt 'baze danych' i potrzebuje stworzyc unikalne id jesli ktos moze pomoc to bardzo bym prosił, problem jest tego typu ze najpierw mam wczytac dane z pliku i potem jak bede dodawal juz jakies nowe elementy to ID ma sie nie powtarzac a mi niestety sie powtarza :( oto fragmenty kodu.

struct str1 {
	int nr;
	string imie;
	string nazwisko;
	string kierunek;
	double rok;
	str1* nast;
};

str1* lista;
int numer,lr; //lr-liczba rekordow

void dodaj(str1* &wl)
{

	str1* wn=new str1;
	numer++; lr++;
	
	cout<<"Nr: "<<numer<<endl;
	wn->nr=numer;
	cout<<"Imie: "; cin>>wn->imie;
	cout<<"Nazwisko: "; cin>>wn->nazwisko;
	cout<<"Rok studiow: "; cin>>wn->rok;
	cout<<"Kierunek studiow: "; cin>>wn->kierunek;
	wn->nast=wl;
	wl=wn;
}

void wczytaj_baze(str1* &wl)
{
	int n=0;
	str1* wn;
	string nazwa_pliku="baza_danych.txt";
	ifstream dane;
	dane.open(nazwa_pliku.c_str(),ios::app);
	if(!dane) 
	{
		cerr<<"\n Nie udalo sie otworzyc pliku...";
	}
	cout<<"Dane z pliku: "<<endl;
	while (dane)
	{
		wn=new str1;
		dane>>wn->nr>>wn->imie>>wn->nazwisko>>wn->rok>>wn->kierunek;
		if(wn->imie=="")break;
		n++; lr++;
		wn->nast=wl;
		wl=wn;
	}
	dane.close();
	
	cout<<"\nWczytanego rekordow: "<<n<<endl;
	system("pause");
}
0
void wczytaj_baze(str1* &wl)
{
	numer = -1;

	(...)

	while (dane)
	{
		(...)
		
		if(wn->nr > numer) numer = wn->nr;
	}

	(...)
}
0

podziękował działa świetnie :)

0

Uważajcie z tym liczeniem ID podczas zaczytywania. To będzie działać jeżeli wszystkie rekordy w bazie będą miały zdefiniowaną wartość imię.

if(wn->imie=="")break;

Zaprojektuj prosty nagłówek i zapisuj te dane w pliku bazy danych (lub w innym).
Przy każdym wpisaniu nowych wartości do bazy będziesz musiał zaktualizować te wartości. Trochę pracy a rozwiązanie będzie bardzie pro.
np taki.

struct naglowek
{
    int maxID;
    int param1;
    int param2;
    int param3;
    int param4;
};
</cpp>
0

Uważajcie z tym liczeniem ID podczas zaczytywania. (...)

To nie rzutuje, bo i tak pętla będzie przerwana, więc samo liczenie id jest ok. Co najwyżej pogubi rekordy, ale to już inna para kaloszy... ;-)

0

no to 1 rozwiazanie mi bardzo odpowiada :) a mam jeszcze jedno pytanie jak moge edytowac rekord bez zmiany jego ID? tzn mam cos takiego:

void edytuj_id(element* &wl)
{
				int x;
				char z;
				cout<<"\nPodaj ID: "; 
				cin>>x;
				while(wl->nr!=x)	wl=wl->nast;
				cout<<wl->nr<<" "<<wl->imie<<" "<<wl->nazwisko<<" "<<wl->rok<<" "<<wl->kierunek<<" ";
				cout<<"\n Czy edytowac? (y/n)";
				cin>>z;
				switch(z)
				{
					case 'y': 
					{
						x==numer;
						element* wn=new element;
						cout<<"ID: "<<numer;
						wn->nr=numer;
						cout<<"\nPodaj imie: "; cin>>wn->imie;
						cout<<"Podaj nazwisko: "; cin>>wn->nazwisko;
						cout<<"Rok: "; cin>>wn->rok;
						cout<<"Kierunek: "; cin>>wn->kierunek;
						wn->nast=wl;
						wl=wn;
					}
}

tylko ze mi cos do konca nie działa;/ po prostu chodzi oto zeby nadpisal mi stare dane pod danym id

0

Z kodu wynika, że dodajesz nowy element przed edytowanym, z edycją ma to niewiele wspólnego.

Jeśli chodzi o pytanie, to tak, możesz edytować bez zmiany ID.

--- edit ---

void edytuj_id(element* &wl)
{
	(...)

	while(wl->nr!=x)        wl=wl->nast; // <--- (1)

	(...)

	x==numer; // <--- (2)

	(...)

	wn->nr=numer; // <--- (3)
	wl=wn; // <--- (1)

  1. nie wiem jak Ty tę funkcję wywołujesz, ale nie jest to dobry pomysł, żeby operować w tym miejscu na wl. Ewentualnie wywal ampersanda z parametru.
  2. co to i po co?
  3. numer zawiera id, które jest już zajęte. Zwiększ wartość i dopiero przypisuj.
0

pozostaje pytanie tylko jak bo probuje to modyfikowac tylko ze ciagle mam jakies bledy bo albo nie zmodyfikuje tego co trzeba albo w ogole nic nie zmieni;/ jak ktos wie jak to bardzo bym prosil żeby zmodyfikował ten kod powyżej

0

ok dzieki bede próbował a faktycznie & ma tam nie byc pomyliłem sie ;)

0

Nie rozumiem z czym masz problem? (zakładam, że powyższy kod napisałeś sam). Szukasz rekordu o zadanym ID i zmieniasz jego pola, poza ID oczywiście. Nic nie dodajesz, nic nie usuwasz, operujesz na istniejącym rekordzie.

0

juz chyba jestem na dobrej drodze ale dalej cos nie gra zrobilem cos takiego

void edytuj_id(element* &wl)
{
				int x;
				char z;
				cout<<"\nPodaj ID: "; 
				cin>>x;
				while(wl->nr!=x)	wl=wl->nast;

				element* wn=wl;
				cout<<"\nPodaj imie: "; cin>>wn->imie;
				cout<<"Podaj nazwisko: "; cin>>wn->nazwisko;
				cout<<"Rok: "; cin>>wn->rok;
				cout<<"Kierunek: "; cin>>wn->kierunek;
}

i juz w zasadzie edytuje rekord tylko nie wiem czemu usuwa z bazy wcześniejszy ;/

0

a raczej usuwa wszystkie rekordy wyświetlając tylko ten jeden ;/ ktory byl edytowany

0

sory za taki spam ale jednak sobie poradzilem temat do zamkniecia edentualnie usuniecia

1 użytkowników online, w tym zalogowanych: 0, gości: 1