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