Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Работа со структурами


Автор: Vit_as 17.4.2004, 09:04
Помогите плиз решить два вопроса.
1). Аллокирование памяти для структуры. Есть файл куда заносятся данные.
struct Baze
{
char artist[30];
char kompoz[30];
int year;
char album[30];
};
2). Удаление одного элемента структуры из файла.

Автор: achmed 17.4.2004, 10:04
не очень понятен вопрос, опиши задачу поподробней

Автор: mr.DUDA 17.4.2004, 10:16
1) проблема с динамическим выделением памяти под объект ?
Цитата
Baze *obj = new Baze;
// или
Baze *obj = (Baze *)malloc(sizeof(Baze));

или с записью объекта в файл ?
2) если нужно вырезать кусок из файла, то придётся создавать новый файл, куда записывать фрагменты "до" и "после" вырезанного куска оригинального файла.

З.Ы.
Модератор: Пожалуйста, один топик - один вопрос.

Автор: Vit_as 17.4.2004, 10:37
Задача состоит в том что надо создать базу данных на С++ в консольном приложении, с использованием структуры. Запись в файл, просмотр базы, сортировку и поиск я уже сделал. Но память под массив ограничена (надо сделать выделение памяти). И плюс еще не знаю как делать удаление одного элемента структуры из файла.

Автор: sergejzr 17.4.2004, 12:38
Да, задал ты себе задачку...
Насколько я понимаю, ты хочешь создать что то типа Обьект-ориентированной ба3ы данных.
Посмотри тут для того , что бы представить как такой прототип работает, .
http://www.garret.ru/~knizhnik/fastdb.html
(Очень радует, что создалэто наш соотечественник.)
Работа происходит примерно так:
  • Фаил маппается в память
  • там всё создаётся/удаляется
  • Фаил маппается на место.
При этом указателем на обьект является индех структуры в файле.
То есть грубо говоря:
Существует щапка файла где хранятся позиции первых структур в файле. Каждая структура содержит в себе данные плус позицию следующей структуры. Таким образом сохраняются не только сами данные, но и вспомогательные структуры индехаций (например B-Tree). Новый елемент добавляется в конец файла/массива (если массив, то в памяти он конечно должен быть гораздо больше самой БД).

Даже у этого человека в докторской работе обьект (структура) не удаляется физически (пришлось бы переписывать вес маппанный массив). На неё просто больше ни чего не указывает. Время от времени БД переписывается заново и тогда естесственно "мёртвые" обьекты не перенимаются.

Если тебе не принципиально создаватьэту беду самому, я бы (как уже много раз) предложилhttp://www.sqlite.org.
С небольшой модификацией туда можно складывать и структуры.

Автор: maxim1000 17.4.2004, 18:33
Цитата
если нужно вырезать кусок из файла, то придётся создавать новый файл, куда записывать фрагменты "до" и "после" вырезанного куска оригинального файла.

ну не совсем smile.gif
если размер структуры постоянный (а если я не ошибаюсь, здесь именно такой случай), можно поступить так:
1. читаем последнюю запись в файле
2. записываем ее на место той, которую нужно удалить
3. теперь, когда у нас появилось две копии последней записи, обрезаем ту, которая в конце файла (тут даже где-то был топик, как это делать)
Цитата
Но память под массив ограничена (надо сделать выделение памяти)

если здесь имеется в виду массив всех записей, то читать его весь в оперативную память, как мне кажется, не совсем хорошая идея...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)