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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2014, 09:39   #1
Monstrous
Новичок
Джуниор
 
Регистрация: 21.02.2014
Сообщений: 2
По умолчанию Загрузка данных из файла, содержащего записи в виде структур, в StringGrid

Здравствуйте!

Поставлена задача:
1. Создать файл с типом записи, содержащий параметры некоторых отечественных микроЭВМ. Записи имеют поля:
Марка микроЭВМ Разрядность Быстродействие Емкость ОЗУ Емкость ПЗУ Число регистров пользователя Число команд

2. Добавить три новые записи.
3. Вывести марки микроЭВМ, имеющих следующие параметры: емкость ОЗУ = 56 кбт и число команд = 67.
Код:
#include <iostream>
#include <fstream>
…
struct microcomputer {
    AnsiString model;
    int wordSize;
    int speed;
    int RAM;
    int ROM;
    int registers;
    int numberOfInstructions;
};
 
void loadRecordsFromFile (UnicodeString fileName)
{
    ifstream ifile(fileName.c_str(), ios::binary);
    microcomputer unit;
    int curRow = 1;
    while (!ifile.read((char*)&unit, sizeof(microcomputer)).eof()) {
        FmLab03->SG->RowCount = curRow + 1;
        FmLab03->SG->Cells[0][curRow] = unit.model.c_str();
        FmLab03->SG->Cells[1][curRow] = unit.wordSize;
        FmLab03->SG->Cells[2][curRow] = unit.speed;
        FmLab03->SG->Cells[3][curRow] = unit.RAM;
        FmLab03->SG->Cells[4][curRow] = unit.ROM;
        FmLab03->SG->Cells[5][curRow] = unit.registers;
        FmLab03->SG->Cells[6][curRow] = unit.numberOfInstructions;
        curRow++;
    }
    ifile.close();
}
//---------------------------------------------------------------------------
void saveRecordsToFile ()
{
    ofstream ofile(FmLab03->SaveDialog1->FileName.c_str(), ios::binary);
    for (int i = 1; i < FmLab03->SG->RowCount; i++) {
        microcomputer unit;
        unit.model = FmLab03->SG->Cells[0][i];
        unit.wordSize = StrToInt(FmLab03->SG->Cells[1][i]);
        unit.speed = StrToInt(FmLab03->SG->Cells[2][i]);
        unit.RAM = StrToInt(FmLab03->SG->Cells[3][i]);
        unit.ROM = StrToInt(FmLab03->SG->Cells[4][i]);
        unit.registers = StrToInt(FmLab03->SG->Cells[5][i]);
        unit.numberOfInstructions = StrToInt(FmLab03->SG->Cells[6][i]);
        ofile.write((char*)&unit, sizeof(microcomputer));
    }
    ofile.close();
}
//---------------------------------------------------------------------------
void __fastcall TFmLab03::FormCreate(TObject *Sender)
{
    SG->Cells[0][0] = "Марка МикроЭВМ";
    SG->Cells[1][0] = "Разрядность";
    SG->Cells[2][0] = "Быстродействие";
    SG->Cells[3][0] = "Ёмкость ОЗУ";
    SG->Cells[4][0] = "Ёмкость ПЗУ";
    SG->Cells[5][0] = "Число регистров пользователя";
    SG->Cells[6][0] = "Число команд";
    SG->RowHeights[0] = 45;
 
    microcomputer unit1 = {"Электроника-60", 16, 250000, 64, 8, 16, 81};
    microcomputer unit2 = {"Электроника-X", 8, 3000000, 1024, 54, 26, 112};
 
    ofstream ofile("data.dat", ios::binary);
    ofile.write((char*)&unit1, sizeof(microcomputer));
    ofile.write((char*)&unit2, sizeof(microcomputer));
    ofile.close();
    loadRecordsFromFile("data.dat");
}
//---------------------------------------------------------------------------
void __fastcall TFmLab03::Button1Click(TObject *Sender)
{
//  loadRecordsFromFile("data.dat");
    if (OpenDialog1->Execute()) {
        loadRecordsFromFile(OpenDialog1->FileName);
    }
}
//---------------------------------------------------------------------------
void __fastcall TFmLab03::OpenFileClick(TObject *Sender)
{
    if (OpenDialog1->Execute()) {
        loadRecordsFromFile(OpenDialog1->FileName);
    }
}
//---------------------------------------------------------------------------
Данные прекрасно считываются командой loadRecordsFromFile("data.dat"); из события FormCreate основной формы и заносятся в StringGrid.
Проблема в том, что при попытке считать данные из файла командой loadRecordsFromFile(OpenDialog1->FileName); или даже той же командой loadRecordsFromFile("data.dat"); в обработчике событий нажатия на кнопку компоненты TMainMenu или на кнопку TButton столбец, содержащий название модели микроЭВМ, либо заполняется крякозябрами, либо вовсе пустует и после заполнения данными последней строки компоненты StringGrid (по выходу из обработчика одного из этих двух событий) генерируется исключение "Invalid pointer operation"(не каждый раз).

Есть ещё пара вопросов.
Есть ли простой способ реализовать возможность перемещения строк компоненты StringGrid? При этом нужно чтобы количество фиксированных строк оставалось равным нулю.
Может быть есть возможность осуществить перенос строк в ячейке таблицы, текст в которой не помещается в заданную длину, без ручной перерисовки?
Ну и если Вам совсем делать нечего посоветуйте что делать с фильтрацией(время поджимает). В приципе я себе представляю что делать, но для меня есть неясности с удалением записи в отфильтрованной таблице и с сохранением данных.
Monstrous вне форума Ответить с цитированием
Старый 21.02.2014, 18:04   #2
Monstrous
Новичок
Джуниор
 
Регистрация: 21.02.2014
Сообщений: 2
По умолчанию

Я описывал в структуре параметр типа AnsiString. Как мне подсказали
"тип AnsiString нельзя просто так читать/писать в бинарники - это указатель на строку а не сама строка
в общем RTFM как всегда".
Заменил на
char model[256];
Monstrous вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C. Загрузка динамического массива структур из файла. NewLamer&Programer Помощь студентам 34 27.05.2013 16:14
Составить программу обработки данных в виде структур. Starget Помощь студентам 2 10.03.2013 13:36
Загрузка из файла динамического массива структур Astronomy Общие вопросы C/C++ 1 27.12.2011 21:32
запись и загрузка с бинарного файла массива структур zetaBiT Общие вопросы C/C++ 14 28.08.2011 23:24
Чтение данных из файла содержащего комментарии. С++ htzg Общие вопросы C/C++ 0 17.04.2010 17:46