Myślałem że obędzie się bez przepisywania całości, ale cóż, tak czy owak dzięki Ci :)
Pewnie to jakiś głupi błąd ale jakoś go nie widzę, co jest teraz nie tam w tej funkcji ?
//---------------------------------------------------------------------------
#include <vcl.h>
#include<stdio.h>
#include<conio.h>
#include<iostream.h>
#include<fstream>
//---------------------------------------------------------------------------
/* enum nosnik_danych{
CD ;
DVD;
Blu-Ray;
} */
//----------------------------------------------------------------------------
void menu()
{
//system("cls");
cout<<"1.Dopisanie rekordu do bazy"<<endl
<<"2.Usuniecie z bazy 1 rekordu"<<endl
<<"3.Przegladanie:"<<endl
<<"4.Edycja wybranego rekordu"<<endl
<<"5.Wyzerowanie calej bazy"<< endl
<<"0.Wylacz program"<<endl;
}
void menu2()
{
cout<<endl<<"1.Nastepny rekord"<<endl
<< "2.Poprzedni rekord"<<endl<<"3.koniec"<<endl;
}
void menu3()
{
cout<<"Jakie dane chcialbys zmienic:"<<endl
<<"1.Wykonawca"<<endl
<<"2.Tytyl"<<endl
<<"3.Nosnik"<<endl
<<"4.Format"<<endl
<<"0.Wroc do menu glownego"<<endl;
}
//-----------------------------------------------------------------------------
struct plyta
{
char wykonawca[20];
char tytul[20];
char nosnik[20];
char format[20];
};
plyta p;
FILE *ptr;
//-----------------------------------------------------------------------------
void zapis_plik( plyta *dane)
{
int rozmiar = sizeof(plyta);
system("cls");
cout<<"Zapis struktury do pliku";
fseek(ptr,0,2) ;
if (fwrite(dane,rozmiar,1,ptr) !=1)
{
cout<<"Blad zapisu";
exit(2);
}
}
//-----------------------------------------------------------------------------
int z=0;
void odczyt (int i)
{
plyta x;
int rozmiar = sizeof(plyta);
if(i==1)
{
z+=rozmiar;
fseek(ptr,z,0);
}
if(i==2)
{
z-=rozmiar;
fseek(ptr,z,0);
}
if(i==0)
{
fseek(ptr,0,0);
}
fread(&x,rozmiar,1,ptr);
cout<<endl<<x.wykonawca<<" "<<x.tytul<<" "<<x.nosnik<<" "<<x.format;
}
//----------------------------------------------------------------------------
int n=0;
void zmien(int o, char z[], int a)
{
int rozmiar = sizeof(plyta);
plyta c;
n=rozmiar*o;
fseek(ptr,n,0);
fread(&p,rozmiar,1,ptr);
strcpy(c.wykonawca,(a==1)?z:p.wykonawca);
strcpy(c.tytul,(a==2)?z:p.tytul);
strcpy( c.nosnik,(a==3)?z:p.nosnik);
strcpy( c.format,(a==4)?z:p.format );
fseek(ptr,n,0);
if (fwrite(&c,rozmiar,1,ptr) !=1)
{
cout<<"Blad zapisu";
exit(2);
}
}
//-----------------------------------------------------------------------------
void wyczysc()
{
system("cls");
fclose(ptr);
if ((ptr = fopen("D:\\dane.dat","w+b")) == NULL)
{
cout<<"Blad otwarcia pliku";
exit(1);
}
fclose(ptr);
cout<<"Baza wyczyszczona"<<endl;
if ((ptr = fopen("D:\\dane.dat","r+b")) == NULL)
{
cout<<"Blad otwarcia pliku";
exit(1);
}
}
//----------------------------------------------------------------------------
int us=0;
int up=0;
int i=0;
void usun_rec(int k)
{
FILE *tmp;
int rozmiar = sizeof(plyta);
if ((tmp = fopen("D:\\tmpik.dat","wb")) == NULL)
{
cout<<"Blad otwarcia pliku";
exit(1);
}
plyta t;
int c;
while((c=fgetc( ptr )) != EOF)
{
fseek(ptr,us,0);
fread(&p,rozmiar,1,ptr);
strcpy(t.wykonawca,p.wykonawca);
strcpy(t.tytul,p.tytul);
strcpy( t.nosnik,p.nosnik);
strcpy( t.format,p.format );
fseek(tmp,up,0);
if (fwrite(&t,rozmiar,1,tmp) !=1)
{
cout<<"Blad zapisu";
exit(2);
}
if(us==k)
{
us+=(rozmiar*2);
}
else
{
us+=rozmiar;
}
up+=rozmiar;
}
wyczysc();
while((c=fgetc( tmp ) ) != EOF)
{
fseek(tmp,i,0);
fread(&p,rozmiar,1,tmp);
strcpy(t.wykonawca,p.wykonawca);
strcpy(t.tytul,p.tytul);
strcpy( t.nosnik,p.nosnik);
strcpy( t.format,p.format );
fseek(ptr,i,0);
if (fwrite(&t,rozmiar,1,ptr) !=1)
{
cout<<"Blad zapisu";
exit(2);
}
i+=rozmiar;
}
fclose(tmp);
}
//-----------------------------------------------------------------------------
int main()
{
if ((ptr = fopen("D:\\dane.dat","r+b")) == NULL)
{
cout<<"Blad otwarcia pliku";
exit(1);
}
int t=0;
int ss=0;
int a=1;
char tytul[20];
char wykonawca[20];
char nosnik[20];
char format[20];
menu();
while(a!=0)
{
cin>>a;
switch(a)
{
case 1:
{
system("cls");
cout<<"Wykonawca:" ;
cin>>wykonawca;
cout<<endl<<"Tytul:";
cin>>tytul;
cout<<endl<<"Nosnik:";
cin>>nosnik;
cout<<endl<<"Format:";
cin>>format;
cout<<endl;
strcpy(p.wykonawca,wykonawca);
strcpy(p.tytul,tytul);
strcpy(p.nosnik ,nosnik);
strcpy(p.format,format);
zapis_plik(&p);
}
break;
case 2:
{
int u;
cout<<"Usun rekord numer:";
cin>>u;
/* strcpy(p.wykonawca,"#");
strcpy(p.tytul,"#");
strcpy(p.nosnik ,"#");
strcpy(p.format,"#"); */
usun_rec(u);
}
break;
case 3:
{
ss=0;
system("cls");
odczyt(t);
menu2() ;
while(ss!=3)
{
cin>>ss;
if(ss==1)
{
odczyt(ss);
}
if (ss==2)
{
odczyt(ss);
}
if (ss!=1 && ss!=2 && ss!=3 )
{
cout<<"zle polecenie";
}
menu2() ;
}
}
break;
case 4:
{
system("cls");
plyta y;
cout<<"Wybierz rekord ktory chcesz zmodyfikowac:" ;
cin>>ss;
menu3();
int p=1 ;
while(p!=0)
{
cin>>p;
switch(p)
{
case 1:
{
cout<<"Wykonawca:" ;
cin>>wykonawca;
zmien(ss,wykonawca,p);
}
break;
case 2:
{
cout<<endl<<"Tytul:";
cin>>tytul;
zmien(ss,tytul,p);
}
break;
case 3:
{
cout<<endl<<"Nosnik:";
cin>>nosnik;
zmien(ss,nosnik,p);
}
break;
case 4:
{
cout<<endl<<"Format:";
cin>>format;
zmien(ss,format,p);
}
break;
}
menu3();
}
}
break;
case 5:
{
wyczysc();
}
break;
}
menu();
}
fclose(ptr);
return 0;
}
//---------------------------------------------------------------------------