Чтение Файла

Тема в разделе "Общие вопросы по С и С++", создана пользователем EllSH, 12 апр 2013.

  1. EllSH

    EllSH New Member

    Регистрация:
    12 апр 2013
    Сообщения:
    1
    Симпатии:
    0
    Помогите пожалуйста, ошиблась или в функции чтения файла или при вызове.Буду очень благодарна за помощь.


    Код (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);

    }
     
Загрузка...

Поделиться этой страницей