Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика программирование, учебник.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
22.08 Mб
Скачать

3.5 Создание индексного файла

Процесс первоначального создания индексного файла называется индексацией. При работе с базой данных существует невидимая информационная (реляционная) связь между двумя таблицами (файлами STUDENTS.DAT и STUDENTS.NTX), при этом индексный файл должен постоянно отслеживать состояние основного файла. Этот процесс необходимый атрибут ведения базы данных. Но файлы располагаются раздельно, и по этой причине возникают различные ситуации, при которых индексный файл перестает соответствовать основному файлу. В этой ситуации приходится старый индексный файл удалять с диска, а на его месте создавать новый индексный файл. Этот процесс называется переиндексацией.

Пример 4. Для файла STUDENTS.DAT, расположенном в корневом каталоге диска A создать индексный файл STUDENTS.NTX, соответствующий табл. 4.

Ниже приведен код программы, обеспечивающей индексацию файла STUDENTS.DAT. Имя индексного файла формируется автоматически из имени основного файла. Файл размещается в том же директории, что и основной.

PROGRAM PR4;

TYPE STUDENT = RECORD

TAB : LONGINT;

FIO : STRING[20];

DATA : STRING[8];

GRUP : STRING[7];

STEPA: REAL

END;

INDEX = RECORD

FIO : STRING[20];

NAMBER: INTEGER

END;

VAR MS: ARRAY[0..20] OF STUDENT;

MI: ARRAY[0..20] OF INDEX; L: INDEX;

I, J, N: INTEGER; FS: FILE OF STUDENT; ST,STI: STRING;

FI: FILE OF INDEX;

BEGIN {ЧТЕНИЕ ФАЙЛА В МАССИВ MS}

WRITELN('ВВЕДИТЕ ИМЯ ИНДЕКСИРУЕМОГО ФАЙЛА: '); READLN(ST);

ASSIGN (FS, ST); RESET(FS);

N := -1; {НОМЕР ЗАПИСИ В ФАЙЛЕ}

WHILE NOT EOF(FS)

DO BEGIN

N := N+1;

READ(FS, MS[N])

END;

CLOSE(FS);

IF N > -1

THEN BEGIN

{ЗАПОЛНЕНИЕ МАССИВА ИНДЕКСОВ MI}

FOR I:=0 TO N

DO BEGIN MI[I].FIO := MS[I].FIO; MI[I].NAMBER := I END;

{СОРТИРОВКА ИНДЕКСНОГО МАССИВА ПО КЛЮЧЕВОМУ ПОЛЮ FIO}

FOR I := 0 TO N

DO FOR J := N DOWNTO I + 1

DO IF MI[J-1].FIO > MI[J].FIO

THEN BEGIN

L := MI[J-1]; MI[J-1] := MI[J]; MI[J] := L

END;

{ФОРМИРОВАНИЕ ИМЕНИ ИНДЕКСНОГО ФАЙЛА}

IF POS('.',ST) = 0

THEN STI := ST + '.NTX'

ELSE STI := COPY(ST, 1, POS('.', ST)) + 'NTX';

{ФОРМИРОВАНИЕ ИНДЕКСНОГО ФАЙЛА}

WRITELN('ЖДИТЕ ИДЕТ ИНДЕКСАЦИЯ ФАЙЛА ...', STI);

ASSIGN(FI, STI); REWRITE(FI);

FOR I := 0 TO N

DO WRITE(FI, MI[I]);

CLOSE(FI)

END

ELSE WRITE ('ФАЙЛ ',ST, ' НЕ СОДЕРЖИТ НИ ОДНОЙ ЗАПИСИ!')

END.

3.6 Работа с файлом произвольного доступа

Рассмотрим четыре важнейших режима работы с файлом прямого доступа: просмотр информации в файле; редактирование содержимого полей существующих в файле записей; корректировку структуры файла с сохранением информации; удаление существующей записей; добавление новой записи.

Просмотр файла

Доступ к компонентам файла произвольного доступа может быть как последовательный, так и произвольный. Но при этом мы просматриваем записи в том порядке как они располагаются на диске в основном файле. Часто этот порядок нас не устраивает. Например, хочется вывести сведения о студентах в алфавитном порядке их фамилий, или по группам, а в каждой группе упорядочить по фамилиям. Именно для этих целей и используются индексные файлы и процедура Seek.

Приведем порядок действий (алгоритм) при просмотре файла произвольного доступа:

  • Присвоить файлу имя (процедура Assign);

  • Открыть файл (процедура Reset) и запросить индексный файл;

  • Присвоить индексному файлу имя (процедура Assign);

  • Открыть индексный файл (процедура Reset);

  • Осуществить последовательный просмотр индексного файла начиная с первой записи до метки EOF, выполняя для каждой записи следующие два пункта.

  • Для каждой записи индексного файла, используя процедуру Seek установить указатель основного файла на соответствующую запись;

  • Считать нужный компонент (оператор read) основного файла и вывести на экран монитора;

  • Закрыть файлы (процедура Close).

Пример 5. Вывести на экран монитора в алфавитном порядке фамилий сведения о студентах, хранящихся в файле STUDENTS.DAT, расположенном в корневом каталоге диска A.

Именно для решения таких задач и создаются индексные файлы. В нашем случае будем использовать индексный файл STUDENTS.NTX.

PROGRAM PR5;

TYPE STUDENT = RECORD

TAB : LONGINT;

FIO : STRING[20];

DATA : STRING[8];

GRUP : STRING[7];

STEPA: REAL

END;

INDEX = RECORD

FIO : STRING[20];

NAMBER: INTEGER

END;

VAR L: INDEX; S: STUDENT; I, J, N: INTEGER;

FS: FILE OF STUDENT; ST, STI: STRING; FI: FILE OF INDEX;

BEGIN {ЧТЕНИЕ ФАЙЛА В МАССИВ MS}

WRITELN('ВВЕДИТЕ ИМЯ ОСНОВНОГО ФАЙЛА: '); READLN(ST);

ASSIGN (FS, ST); RESET(FS);

WRITELN('ВВЕДИТЕ ИМЯ ИНДЕКСНОГО ФАЙЛА: '); READLN(STI);

ASSIGN (FI, STI); RESET(FI);

WHILE NOT EOF(FI) {ПРОСМОТР ИНДЕКСНОГО ФАЙЛА}

DO BEGIN

READ(FI, L);

SEEK(FS, L.NAMBER);

READ(FS, S);

WRITELN(S.TAB:9, S.FIO:15, S.DATA:10, S.GRUP:9 , S.STEPA:9:2)

END;

CLOSE(FS); CLOSE(FI);

END.