Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2012, 14:35   #1
Vl.fom
Пользователь
 
Регистрация: 21.11.2011
Сообщений: 11
По умолчанию С++, Запись и чтение StringGrid в файл

Необходимо разработать пользовательский интерфейс для ввода-вывода информации. Застрял на том, как загрузить данные из файла в StringGrid.
Написал в обработчике, работать не хочет. Может как-то по-другому пойти через создание динамического списка и записи структуры туда?

Привожу код почти полностью, не ругайтесь:
Код:
const int MAX=100;

struct fotik {
  char number[20];
  char firma[20];
  char model[20];
  char price[20];
} ;
struct fotik list[MAX];

}

void __fastcall TForm1::StringGrid1Click(TObject *Sender)
{
StringGrid1 -> Cells [0][0] = "Íîìåð";
StringGrid1 -> Cells [1][0] = "Ôèðìà";
StringGrid1 -> Cells [2][0] = "Ìîäåëü";
StringGrid1 -> Cells [3][0] = "Öåíà";

FILE  *fp;
  register int i;

  if((fp=fopen("list.txt", "rb"))==NULL) {
    printf("Îøèáêà ïðè îòêðûòèè ôàéëà.\n");
    return;
  }

  for(int t=0; t<MAX; ++t) list[t].number[0] = '\0';
  for(i=0; i<MAX; i++)
    if(fread(&list[i],
       sizeof(struct fotik), 1, fp)!=1) {
         if(feof(fp)) break;
         printf("Îøèáêà ïðè ÷òåíèè ôàéëà.\n");
    }

  fclose(fp);
  for (int j=1;j<=MAX;j++){
strcpy(AnsiString(StringGrid1->Cells[1][j]).c_str(),list[j].number);
strcpy(AnsiString(StringGrid1->Cells[2][j]).c_str(),list[j].firma);
strcpy(AnsiString(StringGrid1->Cells[3][j]).c_str(),list[j].model);
strcpy(AnsiString(StringGrid1->Cells[4][j]).c_str(),list[j].price);
}


}

void __fastcall TForm1::TabControl1Change(TObject *Sender)
{
switch (TabControl1->TabIndex){

       case 0:
      StringGrid1 ->Visible = true;
      Button1->Visible = true;
      Button2->Visible = false;
      Button3->Visible = false;
      ComboBox1-> Visible = false;
      Edit1->Visible=false;
      Edit2->Visible=false;
      Edit3->Visible=false;
      Label1->Visible=false;
      Label2->Visible=false;
      Label3->Visible=false;
      Edit3->Text="";
                     break;

       case 1:

      StringGrid1 ->Visible = false;
      Button1->Visible = false;
      Button2->Visible = true;
      Button3->Visible = true;
      ComboBox1-> Visible = true;
      Edit1->Visible=true;
      Edit2->Visible=true;
      Edit3->Visible=true;
      Label1->Visible=true;
      Label2->Visible=true;
      Label3->Visible=true;
      Edit1->Text="";
      Edit2->Text="";
      Edit3->Text="";

                    break;
       }


}

int i,j;
void __fastcall TForm1::Button2Click(TObject *Sender)
{  //Âêëàäêà
  TabControl1->TabIndex=0;
      StringGrid1 ->Visible = true;
      Button1->Visible = true;
      Button2->Visible = false;
      Button3->Visible = false;
      ComboBox1-> Visible = false;
      Edit1->Visible=false;
      Edit2->Visible=false;
      Edit3->Visible=false;
      Label1->Visible=false;
      Label2->Visible=false;
      Label3->Visible=false;
       if (Edit3->Text!=ComboBox1->Items->Strings[ComboBox1->ItemIndex]){
       if (Edit3->Text>0)  ComboBox1->Items->Add(Edit3->Text);}
      

  //Äîáàâëåíèå Ôîòîàïïàðàòîâ â StrinGgrid
  i=0;j++;
  StringGrid1->Cells[i][j]=IntToStr(j);
  i++;
  StringGrid1->Cells[i][j]=Edit3->Text;
  i++;
  StringGrid1->Cells[i][j]=Edit1->Text;
  i++;
  StringGrid1->Cells[i][j]=Edit2->Text;
  i=0;
  StringGrid1->RowCount=j+1;

void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
Edit3->Text=ComboBox1->Text;
}

void __fastcall TForm1::ComboBox1Enter(TObject *Sender)
{
if (ComboBox1->Text!=ComboBox1->Items->Strings[ComboBox1->ItemIndex]){
       if (Edit3->Text>0)  ComboBox1->Items->Add(Edit3->Text);}
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int n=StringGrid1->ColCount;
for (j=1;j<=n;j++){
strcpy(list[j].number, AnsiString(StringGrid1->Cells[1][j]).c_str());
strcpy(list[j].firma,  AnsiString(StringGrid1->Cells[2][j]).c_str());
strcpy(list[j].model,  AnsiString(StringGrid1->Cells[3][j]).c_str());
strcpy(list[j].price,  AnsiString(StringGrid1->Cells[4][j]).c_str());
}

FILE  *fp;
  register int i;

  if((fp=fopen("list.txt", "wb"))==NULL) {
    printf("Îøèáêà ïðè îòêðûòèè ôàéëà.\n");
    return;
  }

  for(i=0; i<n; i++)
    if(*list[i].number)
      if(fwrite(&list[i],
         sizeof(struct fotik), 1, fp)!=1)
           printf("Îøèáêà ïðè çàïèñè ôàéëà.\n");

  fclose(fp);
}

void __fastcall TForm1::StringGrid1Enter(TObject *Sender)
{
for (int j=1;j<=MAX;j++){
strcpy(AnsiString(StringGrid1->Cells[1][j]).c_str(),list[j].number);
strcpy(AnsiString(StringGrid1->Cells[2][j]).c_str(),list[j].firma);
strcpy(AnsiString(StringGrid1->Cells[3][j]).c_str(),list[j].model);
strcpy(AnsiString(StringGrid1->Cells[4][j]).c_str(),list[j].price);
}
}
Vl.fom вне форума Ответить с цитированием
Старый 13.04.2012, 16:53   #2
Vl.fom
Пользователь
 
Регистрация: 21.11.2011
Сообщений: 11
По умолчанию --

Может кто-нибудь что-нибудь подскажет? Печаль(

Последний раз редактировалось Vl.fom; 13.04.2012 в 18:44.
Vl.fom вне форума Ответить с цитированием
Старый 13.04.2012, 19:50   #3
microbit
Форумчанин
 
Аватар для microbit
 
Регистрация: 26.09.2011
Сообщений: 176
По умолчанию

что тут сказать, кода "многа" и код не очень
вот здесь может зайти за массив
Код:
int n=StringGrid1->ColCount;
for (j=1;j<=n;j++){
да и вот здесь у вас обращение к 101 в массиве
Код:
for (int j=1;j<=MAX;j++){
microbit вне форума Ответить с цитированием
Старый 22.04.2012, 21:21   #4
Vl.fom
Пользователь
 
Регистрация: 21.11.2011
Сообщений: 11
По умолчанию

Помогите , никак не доделаю.
Объясняю заново, что требуется получить: Необходимо разработать интерфейс в среде Borland C++ для ввода-вывода информации. В программе данные должны храниться в виде динамического двусвязного линейного списка. Дополнительно необходимо предусмотреть автоматическое сохранение (и восстановление) данных в файле (из файла)(считывание из файла при запуске программы, запись в файл при закрытии программы).

Интерфейс содержит данные по фотоаппаратам :
Номер, Фирма, Модель, Цена. - Хранятся в TStringGrid.

Собственно интерфейс есть , все как надо - Заношу данные из Edit в StringGrid, затем StringGrid сохраняю в список - список в файл. Все ок.
Но вот считать данные при открытии из списка в StringGrid никак не получается.

Код:
Привожу код двусвязного списка:
struct fotik {
  char number[20];
  char firma[20];
  char model[20];
  char price[20];
  struct fotik *next;  /* указатель на следующую запись */
  struct fotik *prior;  /* указатель на предыдущую запись */
} ;

struct fotik *start;  /* указатель на первую запись списка */
struct fotik *last;  /* указатель на последнюю запись */

void dls_store(
  struct fotik *i,   /* íîâûé ýëåìåíò */
  struct fotik **start, /* ïåðâûé ýëåìåíò ñïèñêà */
  struct fotik **last /* ïîñëåäíèé ýëåìåíò ñïèñêà */
)
{
  struct fotik *old, *p;

  if(*last==NULL) {  /* ïåðâûé ýëåìåíò ñïèñêà */
    i->next = NULL;
    i->prior = NULL;
    *last = i;
    *start = i;
    return;
  }
  p = *start; /* íà÷àòü ñ íà÷àëà ñïèñêà */

  old = NULL;
  while(p) {
    if(strcmp(p->number, i->number)<0){
      old = p;
      p = p->next;
    }
    else {
      if(p->prior) {
        p->prior->next = i;
        i->next = p;
        i->prior = p->prior;
        p->prior = i;
        return;
      }
      i->next = p; /* íîâûé ïåðâûé ýëåìåíò */
      i->prior = NULL;
      p->prior = i;
      *start = i;
      return;
    }
  }
  old->next = i; /* âñòàâêà â êîíåö */
  i->next = NULL;
  i->prior = old;
  *last = i;
}

Код загрузки из файла в список и из списка в StringGrid:
struct fotik *info;

  FILE *fp;

  fp = fopen("list.txt", "rb");
  if(!fp) {
    exit(1);
  }



  while(!feof(fp)) {
    info = (struct fotik *) malloc(sizeof(struct fotik));
    if(!info) {
      return;
    }
    if(1 != fread(info, sizeof(struct fotik), 1, fp)) break;
    dls_store(info, &start, &last);
  }
  fclose(fp);


info = start;
  while(info) {
    int j=1;
    info = (struct fotik *)malloc(sizeof(struct fotik));
    if(!info) {
      return;
    }

    strcpy(AnsiString(StringGrid1->Cells[0][j]).c_str(),info->number);
    strcpy(AnsiString(StringGrid1->Cells[1][j]).c_str(),info->firma);
    strcpy(AnsiString(StringGrid1->Cells[2][j]).c_str(),info->model);
    strcpy(AnsiString(StringGrid1->Cells[3][j]).c_str(),info->price);
    dls_store(info, &start, &last);
    info = info->next;
    j++;}

В обработчике OnCreate .
Что не так? По идее поля списка должны отобразиться в ячейках StringGrid, но нет...

Последний раз редактировалось Vl.fom; 22.04.2012 в 21:36.
Vl.fom вне форума Ответить с цитированием
Старый 23.04.2012, 00:49   #5
Vl.fom
Пользователь
 
Регистрация: 21.11.2011
Сообщений: 11
По умолчанию

Сейчас попробую без всяких списков с компонентом Memo реализовать
Vl.fom вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение и запись из/в файл Pirotexnik Общие вопросы C/C++ 7 28.01.2011 16:54
Чтение и запись в файл Dycek Общие вопросы C/C++ 0 18.01.2011 15:04
Чтение и запись в файл. Ky3Heu, Помощь студентам 0 01.01.2010 11:24
Чтение и запись в файл deagle05 Общие вопросы C/C++ 3 22.12.2009 00:11
Чтение/запись в файл в StringGrid SVadiks Помощь студентам 0 03.12.2009 22:14