Чтение Файла

EllSH

New member
12.04.2013
1
0
#1
Помогите пожалуйста, ошиблась или в функции чтения файла или при вызове.Буду очень благодарна за помощь.


C++:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//Элементы списка
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;}
Data *Find_key(int key);
void Delete(Data *d);
void Delete_key(int key);
void Query(int key,TStringGrid *sg);
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;
}}
}

Data *List::Find_key(int key)
{
Data *d=Begin;
while (d)
{
if(d->str.power==key) return d;
d=d->next;
}
return NULL;
}

void List::Delete(Data *d)
{
Data *temp;
temp=d;
if (temp->prev)
{
temp->prev->next=temp->next;
if(temp->next) temp->next->prev=temp->prev;
else End=temp->prev;
}
else
{
if(temp->next)
{
temp->next->prev=NULL;
Begin=temp->next;
}
else Begin=End=NULL;
}
/*if (temp==Begin)
{if(temp!=End) temp->next->prev=NULL;
Begin=Begin->next;}
else
if (temp==End)
{(temp->prev)->next=NULL;
End=temp->prev;}
else if (Begin==NULL) return;
else if (Begin==End)
{Begin=NULL;
End=NULL;}
else
{(temp->next)->prev=temp->prev;
(temp->prev)->next=temp->next;}
num_el--;*/
delete temp;
delete d;
}

void List::Delete_key(int key)
{
Data *temp;
temp=Find_key(key);
Delete(temp);
}

void List::Query(int key,TStringGrid *sg)
{
Data *d=Begin;
int j=1;
while (d)
{
if(d->str.power<=key)
{
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);
}
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::bFind_DeleteClick(TObject *Sender)
{
int k=eKey->Text.ToInt();
ls.Delete_key(k);
ls.Print_SG(sg1);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::bDeleteClick(TObject *Sender)
{ls.~List();
/*while (ls.num_el!=0)
{ls.Delete(ls.prev);}*/
ls.Print_SG(sg1);
}
//---------------------------------------------------------------------------


void __fastcall TForm1::bQueryClick(TObject *Sender)
{
int q=eKey_Query->Text.ToInt();
ls.Query(q,sg2);
if (sg2->Cells[0][1].IsEmpty())
{lError->Caption="Нет машин, мощностью не более " + IntToStr(q);}
}
//---------------------------------------------------------------------------



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

}