baza danych problem z usuwaniem

0

Witam, mam problem z opcja usuwania w swojej bazie, a mianowicie nie usuwa;d
mógłby ktoś zerknąć na kod?

	
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

struct dane
{
	int numer;		   ///   numer w bazie
	string nazwisko;
	string imie;
	int wiek;                   
	long long int pesel;
};


/// dodawanie do bazy danych wszelkie informacje znajduja sie w pliku *.txt

void dodaj_do_bazy(char *in,dane *s,int n)
{
	ofstream plik;
	plik.open(in);

	for(int i=0;i<n;++i)
	{
		s[i].numer = i+1;
		plik<<s[i].numer<<endl;
		cout<<"Podaj nazwisko :\n";
		cin>>s[i].nazwisko;
		plik<<s[i].nazwisko<<endl;
		cout<<"Podaj imie :\n";
		cin>>s[i].imie;
		plik<<s[i].imie<<endl;
		cout<<"Podaj wiek :\n";
		cin>>s[i].wiek;
		plik<<s[i].wiek<<endl;
		cout<<"Podaj pesel :\n";
		cin>>s[i].pesel;
		plik<<s[i].pesel<<endl;
		
		plik<<"\n\n";
	}
	plik.close();
}


///funkcja liczaca rozmiar tablicy struktur 

int rozmiar(char *in)
{
	string imie , nazwisko;
	int wiek , numer;
	long long int pesel;
	
	ifstream plik;
	plik.open(in);
	int rozm = 0;
	
	while(!plik.eof())
	{
		plik>>numer;
		plik>>nazwisko;
		plik>>imie;
		plik>>wiek;
		plik>>pesel;
		
		rozm += 1;
	}
	
	plik.close();
	return rozm;
}

///funkcja wyciagajaca z pliku osobowe do tablicy struktur
void zpliku(char *in,dane *s,int n)
{
	ifstream plik;
	plik.open(in);
	
	for(int i=0;i<n;++i)
	{
		plik>>s[i].numer;
		plik>>s[i].nazwisko;
		plik>>s[i].imie;
		plik>>s[i].wiek;
		plik>>s[i].pesel;
	}
}

/// funkja wypisujaca wszystkie dane na ekran

void wypisz(dane *s,int n)
{
	for(int i=0;i<n;++i)
	{
		cout<<"Nr."<<s[i].numer<<endl;
		cout<<"Nazwisko :         "<<s[i].nazwisko<<endl;
		cout<<"Imie :         "<<s[i].imie<<endl;
		cout<<"Wiek : "<<s[i].wiek<<endl;
		cout<<"Pesel :          "<<s[i].pesel<<endl;
		cout<<"-  -  -  -  -  -  -  -  -  -  -  -  -\n";
	}
}



/// funkcja sortuje po peslu

void sort(dane *s,int n)
{
	dane tmp;
	for(int i=0;i<n;++i)
	{
		for(int j=0;j<n-1;++j)
		{
			if(s[j].pesel > s[j+1].pesel)
			{
				tmp = s[j+1];
				s[j+1] = s[j];
				s[j] = tmp;
			}
		}
	}
}

	
/// funkcja sortuje po nazwisku

void sort2(dane *s,int n)
{
	dane tmp;
	for(int i=0;i<n;++i)
	{
		for(int j=0;j<n-1;++j)
		{
			if(s[j].nazwisko > s[j+1].nazwisko)
			{
				tmp = s[j+1];
				s[j+1] = s[j];
				s[j] = tmp;
			}
			if(s[j].nazwisko == s[j+1].nazwisko)
			{
				if(s[j].imie > s[j+1].imie)
				{
					tmp = s[j+1];
					s[j+1] = s[j];
					s[j] = tmp;
				}
			}
		}		
	}
}	
	
///funkcja wyszukuje po nr pesel

void szukaj_po_peselu(dane *s,int n,long long int szukany_pesel)
{
	int licznik = 0;
	
	for(int i=0;i<n;++i)
	{
		if(s[i].pesel == szukany_pesel)
		{
			cout<<"Nr."<<s[i].numer<<endl;
			cout<<"Nazwiko :         "<<s[i].nazwisko<<endl;
			cout<<"Imie :         "<<s[i].imie<<endl;
			cout<<"Wiek : "<<s[i].wiek<<endl;
			cout<<"Pesel :          "<<s[i].pesel<<endl;
			cout<<"-  -  -  -  -  -  -  -  -  -  -  -  -\n";
			
			licznik = licznik + 1;  
		}
	}
	if(licznik == 0)
	{
		cout<<"W bazie nie znaleziono takiego peselu. \n\n";
	}
}

///funkcja wyszukuje po nazwisku

void szukaj_po_nazwisku(dane *s,int n,string szukane_nazwisko)
{
	int licznik = 0;
	
	for(int i=0;i<n;++i)
	{
		if(s[i].nazwisko == szukane_nazwisko)
		{
			cout<<"Nr."<<s[i].numer<<endl;
			cout<<"Nazwiko :         "<<s[i].nazwisko<<endl;
			cout<<"Imie :         "<<s[i].imie<<endl;
			cout<<"Wiek : "<<s[i].wiek<<endl;
			cout<<"Pesel :          "<<s[i].pesel<<endl;
			cout<<"-  -  -  -  -  -  -  -  -  -  -  -  -\n";
			
			licznik = licznik + 1; 
		}
	}
	if(licznik == 0)
	{
		cout<<"W bazie nie znaleziono takiego nazwiska. \n\n";
	}
}

/// funkcja usuwajaca danych  z bazy

void usun(dane *s,int n,int ktory)
{
	int tmp;
	for(int i=0;i<n;++i)
	{
		if(i+1 == ktory)
		{
			tmp = i;
		}
	}
	
	for(int i=tmp;i<n;++i)
	{
		s[i] = s[i+1];
		
		s[i].nazwisko = s[i+1].nazwisko;
		s[i].imie = s[i+1].imie;
		s[i].wiek   = s[i+1].wiek;
		s[i].pesel  = s[i+1].pesel;
	}
}



/**------------------------- funkcja main --------------------------**/

int main(int argc,char **argv)
{
	                                                     
	
	int znak;	
	
	
	
	argv[1] = "baza.txt";
	
	do
	{
	cout<<"Utworz baze danych (plik)			wcisnij - 1\n";	
	cout<<"Dodawanie i zapisywanie danych osobowych	wcisnij - 2\n";
	cout<<"Wypisanie wszystkich danych osobowych		wcisnij - 3\n";	
	cout<<"Wyszukanie danych osobowych po nr. pesel	wcisnij - 4\n";
	cout<<"Wyszukanie danych osobowych po nazwisku		wcisnij - 5\n";
	cout<<"Usuwanie danych osobowych z bazy		wcisnij - 6\n";
	cout<<"Sortowanie danych osobowych po nr. pesel	wcisnij - 7\n";
	cout<<"Sortowanie danych osobowych po nazwisku		wcisnij - 8\n";

	
	
	cout<<"Wyjscie z programu				wcisnij - 0\n";
	
	cout<<"Co chcesz uczynic ??\n";
	
	cin>>znak;
	
	
	switch(znak)
	{
		case 1:
		{
			int n;
			cout<<"Ilu osobnikow chcesz dodac ?\n";
			cin>>n;			
			dane *s = new dane [n];
			dodaj_do_bazy(argv[1],s,n);
			delete [] s;
			break;
		}
		case 2:
		{
		
			int ile;
			cout<<"Ilu osobnikow chcesz dodac ?\n";
			cin>>ile;	
					
			int roz = rozmiar(argv[1])+ile-1;
			int rozm = rozmiar(argv[1])-1;
			
					
			dane *s = new dane [roz];
			zpliku(argv[1],s,rozm);
			
			for(int i=rozm;i<roz;++i)
			{
				s[i].numer = i+1;
				cout<<"Podaj nazwisko :\n";
				cin>>s[i].nazwisko;
				cout<<"Podaj imie :\n";
				cin>>s[i].imie;
				cout<<"Podaj wiek :\n";
				cin>>s[i].wiek;
				cout<<"Podaj pesel :\n";
				cin>>s[i].pesel;
			}
		
			ofstream plik;
			plik.open(argv[1]);
			for(int i=0;i<roz;++i)
			{
				plik<<s[i].numer<<endl;
				plik<<s[i].nazwisko<<endl;
				plik<<s[i].imie<<endl;
				plik<<s[i].wiek<<endl;
				plik<<s[i].pesel<<endl;
				plik<<"\n\n";
			}
			plik.close();
			delete [] s;
			break;
		}
		case 3:
		{
			cout<<"Dane w bazie :\n\n";
						
			int n = rozmiar(argv[1])-1;
			dane *s = new dane [n];
			zpliku(argv[1],s,n);
			wypisz(s,n);
			
			delete [] s;
			break;
		}
		case 4:
		{
			long long int szukany_pesel;
			cout<<"Podaj pesel ktory chcesz znalesc \n";
			cin>>szukany_pesel;
		
			int n = rozmiar(argv[1])-1;
			dane *s = new dane [n];
			zpliku(argv[1],s,n);
			
			szukaj_po_peselu(s,n,szukany_pesel);
			
			
			delete [] s;
			break;
		}
		
			case 5:
		{
			string szukane_nazwisko;
			cout<<"Podaj nazwisko ktory chcesz znalesc \n";
			cin>>szukane_nazwisko;
		
			int n = rozmiar(argv[1])-1;
			dane *s = new dane [n];
			zpliku(argv[1],s,n);
			
			szukaj_po_nazwisku(s,n,szukane_nazwisko);
			
			
			delete [] s;
			break;
		}
		
		case 6:
		{
		
			int n = rozmiar(argv[1])-1;
			dane *s = new dane [n];
			zpliku(argv[1],s,n);
		
			int ktory;
			cout<<"Ktory dane osobowe usunac z bazy ?\n";
			cin>>ktory;
			usun(s,n,ktory);
			
			ofstream plik;
			plik.open(argv[1]);
			for(int i=0;i<n-1;++i)
			{
				plik<<s[i].numer<<endl;
				plik<<s[i].nazwisko<<endl;
				plik<<s[i].imie<<endl;
				plik<<s[i].wiek<<endl;
				plik<<s[i].pesel<<endl;
				plik<<"\n\n";
			}
			plik.close();
			
			delete [] s;
			break;
		}
		case 7:
		{
			cout<<"Dane z bazy posortowane po nr. pesel \n";
			int n = rozmiar(argv[1])-1;
			dane *s = new dane [n];
			zpliku(argv[1],s,n);
			sort(s,n);
			wypisz(s,n);
			
			delete [] s;
			break;
		}
		case 8:
		{
			cout<<"Dane z bazy posortowane po nazwisku \n";
			int n = rozmiar(argv[1])-1;
			dane *s = new dane [n];
			zpliku(argv[1],s,n);
			sort2(s,n);
			wypisz(s,n);
			
			delete [] s;
			break;
		
		}
	
		case 0:
		{
			cout<<"Koniec\n";
		
			
		}
	}
	}while(znak != 0);
	
	
	return 0;
} 
0

skoro sortujesz ciągle tym samym sposobem (tylko inne dane) to nie potrzebujesz 4 funkcji tylko jedna oraz klucz po którym będziesz sortować (i polecam zmienić sortowanie z bąbelkowego)
nie musisz zamykać pliku, sam się zamknie po wyjściu z funkcji

void usun(dane *s,int n,int ktory)
{
        int tmp;
        for(int i=0;i<n;++i)
        {
                if(i+1 == ktory)
                {
                        tmp = i;
                }
        }
 
        for(int i=tmp;i<n;++i)
        {
                s[i] = s[i+1];
 
                s[i].nazwisko = s[i+1].nazwisko;
                s[i].imie = s[i+1].imie;
                s[i].wiek   = s[i+1].wiek;
                s[i].pesel  = s[i+1].pesel;
        }
} 

wklejam tutaj twoją funkcje. A co jeżeli będziesz chciał usunąć ostatni element? po co masz tmp skoro tmp = ktory - 1;

zrób po prostu czyczenie tego elementu

if(ktory == i+1){
  s[i].nazwisko = "";
  s[i].imie = "";
  (...)
}

EDIT. Albo jeszcze prosciej w case 6 w petli zrob cos takiego
if(ktory == 1) continue; // podczas zapisywania do pliku

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