Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
1 / 1 / 1
Регистрация: 30.01.2011
Сообщений: 16

Загрузка данных из файла, содержащего записи в виде структур, в StringGrid

20.02.2014, 09:20. Показов 1984. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#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? При этом нужно чтобы количество фиксированных строк оставалось равным нулю.
Может быть есть возможность осуществить перенос строк в ячейке таблицы, текст в которой не помещается в заданную длину, без ручной перерисовки?
Ну и если Вам совсем делать нечего посоветуйте что делать с фильтрацией(время поджимает). В приципе я себе представляю что делать, но для меня есть неясности с удалением записи в отфильтрованной таблице и с сохранением данных.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.02.2014, 09:20
Ответы с готовыми решениями:

Загрузка данных из файла в StringGrid
Здравствуйте. Есть файл .ТХТ содержащий таблицу, в таблице 13 столбцов, первые 12 числа последний строка. 1) Как сделать так чтобы...

Загрузка данных из файла в StringGrid
Будьте любезны подсказать, у меня имеется код, который копирует строчки из файла в StringGrid, например, файл содержит следующие данные: ...

Загрузка данных в stringgrid из файла
Доброго дня всем!Есть код заполнения, он заполняет stringgrid, начиная с первого столбца, как сделать заполнение начиная со 2-го? : if...

1
1 / 1 / 1
Регистрация: 30.01.2011
Сообщений: 16
21.02.2014, 18:04  [ТС]
Я описывал в структуре параметр типа AnsiString. Как мне подсказали
"тип AnsiString нельзя просто так читать/писать в бинарники - это указатель на строку а не сама строка
в общем RTFM как всегда".
Заменил на
char model[256];
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.02.2014, 18:04
Помогаю со студенческими работами здесь

Загрузка данных из файла в StringGrid
Сделал сохранялку грида в файл, а теперь не могу открывашку написать. Условия: Имя файла для открытия указывается в Edit2, выполняется...

Загрузка данных в StringGrid с txt файла
Доброго времени суток. Подскажите как загрузить данные с текстового файла в СтрингГрид с разделителем. Заранее благодарен.

Загрузка данных из Excel и текстового файла в StringGrid (Borland Builder C++)
Здравствуйте! Не подскажите как осуществить загрузку данных из Excel и текстового файла в StringGrid?

Чтение txt файла, содержащего массив структур
Добрый вечер! Прошу помощи у опытных людей. При решении задачи столкнулся с проблемой чтения массива структур из файла. Не могу...

Сохранение из StringGrid массива в файл и загрузка из файла в StringGrid
Всем доброго времени суток =) У меня есть загрузка массива из StringGrid на Delphi 2010: //загрузка из файла procedure...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru