Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа__.doc
Скачиваний:
4
Добавлен:
24.09.2019
Размер:
436.22 Кб
Скачать

Использование идеологии массивов для организации баз данных

И в заключение хочу продемонстрировать Вам универсальность описаных здесь подходов, методов и формул к, казалось бы, совершенно посторонним темам. В качестве примера возьмем файлы dBase III (dbf) и применим к ним методы работы с массивами. Думаете не возможно? Вы ошибаетесь!

Не буду подробно описывать формат файлов dbf, он достаточно широко известен, а сами файлы очень широко распространены. Напомню только, что такие файлы состоят из заголовка, содержащего информацию о базе в целом и о каждом поле, после которого идут собственно записи базы. Причем все записи имеют одинаковую длину, это для нас важно.

Длина заголовка может быть разной, но ее можно определить при открытии файла базы. Из заголовка так же определяется длина записи. Первая запись в базе имеет номер 1, то есть low=1. Этих данных для нашего примера достаточно. Забудем, на время, об удаленных записях, о необходимости корректировки полей в заголовке, при изменении или добавлении записей в базе. Осталось напомнить, что мы можем прочитать дисковый файл с любого байта, и любое количество байт. А теперь пример:

int dBase; /* Дескриптор файла базы */

int base; /* Длина заголовка базы в байтах */

int size; /* Длина записи базы в байтах */

int i; /* Номер записи */

int addr; /* Адрес записи в файле */

char* record; /* Собственно запись базы */

/*

Открываем базу и получаем дескриптор файла, длину заголовка

и длину записи.

*/

. . . . .

/*

Выделяем память для хранения записи в оперативной памяти

*/

record=malloc(size);

/*

Считываем пятую запись базы

*/

i=5;

addr=base+(i-1)*size;

lseek(dBase,addr,SEEK_SET);

read(dBase,record,size);

/*

Изменяем запись

*/

. . . . .

/*

Записываем измененую запись обратно

*/

lseek(dBase,addr,SEEK_SET);

write(dBase,record,size);

/*

Освобождаем занимаемую записью оперативную память

*/

free(record);

/*

Закрываем базу

*/

. . . . .

Не правда ли, все очень просто. Если добавить коррекцию заголовка базы при ее изменении и контроль ошибок, то получится вполне работоспособный набор функций для работы с dbf файлами. Если приложить еще немного усилий, то можно написать набор классов С++ для работы с базами dBase III. Причем это будет работать гораздо быстрее, чем обработка таких баз через ODBC, а места занимать гораздо меньше. Кстати, у меня есть набор таких классов. Он написан году так в 94, и предназначался для программистов переходящих на С++ с CLIPPERа. Как показала практика, эти классы существенно облегчили такой переход. Причем они используются и сейчас (2007 год). Исходные тексты этих классов не привожу сознательно. Написать их не сложно, достаточно пары дней, а в качестве упражнения еще и очень полезно.