Помогите пожалуйста, ошиблась или в функции чтения файла или при вызове.Буду очень благодарна за помощь.
Код:
struct Auto
{
public:
char *mark;
int power;
float cost;
Auto(char *m,int p,float c);
Auto()
{mark="";
cost=0;
power=0;}
};
class Data
{
public:
Auto str;
Data *prev,*next;
Data()
{
prev=NULL;
next=NULL;
}
Data(Auto &inf);
};
class List:public Data
{
public:
Data *Begin,*End;
int num_el;
List()
{Begin=NULL;
End=NULL;
num_el=0;}
~List();
void Add_el(Auto &a);
void Print_SG(TStringGrid *sg);
int Get_num(){return num_el;}
void Write_File(char*fn);
void Read_File(char*fn);
};
//Различные функции и конструкторы
Auto::Auto(char *m,int p,float c)
{
int nl;
nl=strlen(m);
mark=new char[nl+1];
strcpy(mark,m);
mark[nl]='\0';
power=p;
cost=c;
}
Data::Data(Auto &inf)
{
str.mark=inf.mark;
str.power=inf.power;
str.cost=inf.cost;
prev=NULL;
next=NULL;
}
List::~List()
{
Data *s,*t;
s=Begin;
while(s)
{
t=s;
s=s->next;
delete t;
}
num_el=0;
}
void List::Add_el(Auto &a)
{
Data *d;
d=new Data(a);
if(Begin==NULL)
{
Begin=d;
End=d;
}
else
{
End->next=d;
d->prev=End;
End=d;
}
num_el++;
}
void List::Print_SG(TStringGrid *sg)
{
Data *d;
sg->RowCount=2;
int j=1;
d=Begin;
if (num_el==0)
{
sg->Cells[0][j]="";
sg->Cells[1][j]="";
sg->Cells[2][j]="";
sg->Cells[3][1]=IntToStr(Get_num());
}
else
{while(d!=NULL)
{
sg->RowCount=j+1;
sg->Cells[0][j]=AnsiString(d->str.mark);
sg->Cells[1][j]=IntToStr(d->str.power);
sg->Cells[2][j]=FloatToStr(d->str.cost);
sg->Cells[3][1]=IntToStr(Get_num());
j++;
d=d->next;
}}
}
void List::Write_File(char*fn)
{Data *s;
FILE *F1;
if ((F1 = fopen("test.txt", "wb")) == NULL)
exit(1);
fseek(F1, SEEK_SET, 0);
fwrite(&num_el,sizeof(int),1,F1);
s=Begin;
while(s)
{
fwrite(&s->str, sizeof(s->str), 1, F1);
s=s->next;
}
fclose(F1); }
void List::Read_File(char*fn)
{
FILE *F1;
Auto s;
int i=0,n;
F1=fopen("test.txt","rb+");
fseek(F1, SEEK_SET, 0);
fread(&n,sizeof(int),1,F1);
while(i<n)
{
fread(&s,sizeof(s),1,F1);
Add_el(s);
i++;
}
fclose(F1);
}
// Глобальная переменная
List ls;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
sg1->ColCount=4;
sg2->ColCount=4;
Form1->sg1->Cells[0][0]="Марка";
Form1->sg1->Cells[1][0]="Мощность";
Form1->sg1->Cells[2][0]="Цена";
Form1->sg1->Cells[3][0]="Кол-во элементов";
Form1->sg2->Cells[0][0]="Марка";
Form1->sg2->Cells[1][0]="Мощность";
Form1->sg2->Cells[2][0]="Цена";
Form1->sg2->Cells[3][0]="Кол-во элементов";
long Style=GetWindowLong(bFind_Delete->Handle,GWL_STYLE);
SetWindowLong(bFind_Delete->Handle,GWL_STYLE,Style | BS_MULTILINE);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::bAddClick(TObject *Sender)
{
int p=ePower->Text.ToInt();
float c=eCost->Text.ToDouble();
Auto l(eMark->Text.Trim().c_str(),p,c);
ls.Add_el(l);
ls.Print_SG(sg1);
}
//-------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{ ls.Write_File("test.dat");
for(int i = 0; i < sg1->ColCount; i++)
for(int j = 1; j < sg1->RowCount; j++)
sg1->Cells[i][j] = "";
ls.~List();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{ FILE *F1;
Auto str;
F1=fopen("test.dat","rb+");
fseek(F1, SEEK_SET, 0);
fread(&str,sizeof(str),1,F1);
fclose(F1);
sg1->Cells[0][1]=AnsiString(str.mark);
sg1->Cells[1][1]=IntToStr(str.power);
sg1->Cells[2][1]=FloatToStr(str.cost);
}