Usuwanie wartosci ze struktur

0

Takie usuwanie niestety nie działa i nie jest to zbyt dobre rozwiazanie.Jak zrobić usuwanie w tym wypadku najlepiej?

 
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <fstream>
using namespace std;
struct lista_ksiazek
{
char wydawnictwo[30];
char tytul[30];
char autor[30];
int rok;	
void wczytaj();
void wypisz();	
	
	
	
};
void edytuj(lista_ksiazek ks1)
{
char h[30];
	cin>>h;
	int wybor=1;
	ifstream plik ("lista_ksiazek.dat",ios::binary);
		for(;;)
	{
		
		plik.read(reinterpret_cast<char*>(&ks1),sizeof(ks1));
		if(plik.eof())
		break;
	    if(strcmp(ks1.autor,h))
	    cin>>ks1.autor>>ks1.wydawnictwo>>ks1.tytul>>ks1.rok;
	    plik.write(reinterpret_cast<char*>(&ks1),sizeof(ks1));
}
plik.close();
}
void wczytaj(lista_ksiazek ks1)
{
	int wybor=1;
	ofstream plik1("lista_ksiazek.dat",ios::binary|ios::out|ios::app);
	while(wybor)
	{
		cout<<"autor\n";
	cin>>ks1.autor;
	cout<<"wydawnoctwo\n";
	cin>>ks1.wydawnictwo;
	cout<<"tytul \n";
	cin>>ks1.tytul;
	cout<<"rok wydania";
	cin>>ks1.rok;
	plik1.write(reinterpret_cast<char*>(&ks1),sizeof(ks1));
	cout<<"jesli 1 to dalej,0 to koniec wpisywania ";
	cin>>wybor;	
	}
	
	
	plik1.close();
	
}
void wypisz(lista_ksiazek ks1)
{
	int i=1;
	ifstream plik ("lista_ksiazek.dat",ios::binary);
	for(;;)
	{
		
		plik.read(reinterpret_cast<char*>(&ks1),sizeof(ks1));
		if(plik.eof())
		break;
		cout<<"  "<<i<<ks1.autor<<ks1.wydawnictwo<<ks1.tytul<<ks1.rok;
	
		
	}
	
	plik.close();
	
}
bool usun(lista_ksiazek ks1)
{
	char ty[30];
		bool u=false;
	cout<<"podaj tytul ";
	cin>>ty;
	ifstream plik("lista_ksiazek.dat",ios::binary);
	ofstream plik2("lista_ksiazek2.dat", ios::binary);
	plik2.seekp(0,ios::beg);
	for(;;)
	{
	   plik.read(reinterpret_cast<char*>(&ks1),sizeof(ks1));
	   if(plik.eof())
	   break;
	   else  u=true;
	   
	   if(strcmp(ks1.tytul,ty))
	   plik2.write(reinterpret_cast<char*>(&ks1),sizeof(ks1));
}
plik.close();//koniec operacji na plikach
	plik2.close();
	system("del lista_ksiazek.dat"); //usun dane.dat
	system("ren lista_ksiazek2.dat lista_ksiazek.dat");
		
		
	return u;	
		
	}
	
	
	

void wyszukaj(lista_ksiazek ks1)
{
	
char a[30];
char t[30];
cout<<"podaj  autora";
cin>>a;
cout<<" podaj tytul";
cin>>t;
ifstream plik("lista_ksiazek.dat",ios::binary);
for(;;)
{
plik.read(reinterpret_cast<char*>(&ks1),sizeof(ks1));
		if(plik.eof())
		break;
if((strcmp(ks1.tytul,t)) || (strcmp(ks1.autor,a)))
	cout<<ks1.autor<<ks1.wydawnictwo<<ks1.tytul<<ks1.rok;
	
}
plik.close();
	
	
	
	
}
void wypisz_wyd(lista_ksiazek ks1)
{
	
	char w[30];
	cout<<"podaj autor wydawce ";
	cin>>w;
	ifstream plik("lista_ksiazek.dat",ios::binary);
	for(;;)
	{
		plik.read(reinterpret_cast<char*>(&ks1),sizeof(ks1));
		if(plik.eof())
		break;
		if(strcmp(ks1.wydawnictwo,w))
		cout<<" "<<ks1.autor<<" "<<ks1.tytul<<ks1.wydawnictwo<<"  "<<ks1.rok;
		
		
		
	}
	
	
	
}

int main()
{
ofstream plik1("lista_ksiazek.dat",ios::binary|ios::out|ios::app);
lista_ksiazek ks1;
int wybor;
cout<<"Wybierz opcje:\n"
	  "1.Dodaj ksiazke\n"
	  "2.Usun ksiazke\n"
	  "3.Wyszukaj ksiazke\n"
	  "4.wyswietli all\n"
	  "5.Wypisz poszczegolne wydawnictwa\n"
	  "0.Wyjscie\n"
	  ">>";
	  cin>>wybor;
	  
	switch(wybor)
	{
		case 1:
			wczytaj(ks1);
		break;
		case 2:
			usun(ks1);
		break;
		case 3:
			wyszukaj(ks1);
		break;
		case 4:
			wypisz(ks1);
		break;
		case 5:
			wypisz_wyd(ks1);
		break;
		case 6:
			edytuj(ks1);
		default :
			cout<<"wybrales zly numerek"<<endl;
			cin>>wybor;
		break;





   }

		


return 0;
	
	
	
	
	
}


0

Usuwanie jest jedyne słuszne, można jedynie nieco zoptymalizować. Problem polega na tym że w main otwierasz plik do zapisu i go nie zamykasz.

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