- •Практическая работа Тема: Обработка типизированного файла
- •Порядок выполнения работ
- •Содержание отчета:
- •8. Теоретическая часть
- •8.2. Функции обработки типизированного файла
- •Физическое удаление записи с использованием дополнительного файла.
- •У даление записи без использования дополнительного файла.
- •8.10. Функции обработки:
- •8.11. Работа с файлами
- •9. Типовые ошибки
- •Примеры .
- •10.1. Примеры описание типа в языках программирования
- •10. Контрольные вопросы
- •Литература
У даление записи без использования дополнительного файла.
Рисунок, поясняющий физическое удаление записи без использования дополнительного файла:
А) Б) Fn - f
1 |
|
2 |
|
3 |
4 |
4 |
5 |
5 |
6 |
6 |
7 |
7 |
|
1 |
|
2 |
|
3 |
4 |
4 |
|
5 |
|
6 |
|
3
Начало 1 4
Начало ->
2
А) сдвиг одной записи Б) сдвиг всех записей
пояснения к выполнению
Установка файлового указателя на 4-ой записи
Чтение 4-ой записи
Установка файлового указателя на 3-ей (удаляемой) записи.
Запись 4-ой записи на 3-ю запись.
В результате 3-я запись удалена, т.е. на месте старой информации находится новая информация, которая была на записи 4, и мы имеем на 3 и 4 записи месте будут две одинаковые информации.
Словесный алгоритм
Отрываем файл f на режим работы ‘чтение/запись’.
Определяем число записей N в файле f.
Вводим номер записи K, которую надо удалить.
i=0.
Устанавливаем файловый указатель на (K+i) запись.
Читаем К+i-ую запись. (После чтения файловый указатель перемещается на одну запись ниже по файлу).
Устанавливаем файловый указатель на К+i-1-ой записи (минус 2 записи вверх от текущего положения указателя),
Записываем в файл прочитанную ранее запись (см. п. 6 ).
i=i+1
Проверяем K+i=N:
Если K+i не равен N, то повторяем действия начиная с 5 пункта;
- Если К+i=N, то последнюю запись отсекаем (truncate(f) в Pascal).
Закрываем файл.
8.5. Логическое удаление записи – это условное удаление записи, а физически запись остается.
Используемый прием: Для реализации логического удаления необходимо в структуру данных добавлять служебное поле, которое будем служить признаком удаленной записи. Существует различные варианты реализации, например:
1) Поле может иметь одно из значений: TRUE или FALSE
2) При записи БД в служебное поле записывается порядковый номер записи, в случае логического удаления этот номер заменяется на инверсное значение.
3) На практике встречаются и другие варианты реализации.
Логически удаленные записи «невидимые» при выполнении других операций обработки ( изменение записи, поиск, сортировка и т.д.). Это надо учитывать при реализации.
Рассмотрим механизм логического удаления, при этом примем, что удаленная запись помечается отрицательным числом. Пояснения смотри на рисунке:
1 |
|
-2 |
|
3 |
|
-4 |
|
5 |
|
-6 |
|
7 |
|
а) Записи с номерами –2, -4, -6 логически удалены и логически в файле содержатся четыре записи.
Словесный алгоритм логического удаления записи из файла.
Пусть надо удалить k-ую запись из файла
Принимаем: логически удаленная запись – это отрицательный номер записи.
Открываем файл и на чтение и на запись
Устанавливаем файловый указатель на начала К-ой записи.
Читаем К-ую запись из файла.
Изменяем поле, отвечающее за логическое удаление, на инверсное значение.
Устанавливаем указатель на начало К-ой записи.
Записываем К-ую запись в файл.
Закрываем файл.
Как видно алгоритм логического удаления одной записи является линейным, т.е. очень простым.
8.6. Восстановление записей – это восстановление логически удаленных данных. Операция восстановления обратная операция логическому удалению.
8.7. Сжатие данных. Сжатие – это физическое удаление логически удаленных записей.
8.8. Вставка записей: Добавление записи в конец файла является частным случаем операции вставки. Рисунок, поясняющий операцию вставки с использованием дополнительного файла.
f1 (на чтение) f2 (на запись)
-
1
1
2
2
3
3
4
4
5
5
6
- Ввод с клавиатуры
Рисунок, поясняющий операцию вставки без использования дополнительного файла.
f (нач. состояние) f (конечное состояние)
1 |
|
|
1 |
|
2 |
|
|
2 |
|
3 |
|
|
3 |
|
4 |
|
|
4 |
(3’) |
5 |
|
|
5 |
(4’) |
6 |
|
|
6 |
(5’) |
7 |
|
|
7 |
(6’) |
|
8 |
(7’) |
Начало
3
8.9. Сортировка записей с использованием индексного массива на примере упорядочивания данных в БД по одному полю.
Описание метода
Индексы хранятся в памяти в виде массива или в файле. В начальный момент массив инициализируется целыми числами по порядку от 1 до N (число записей в файле). Суть метода состоит в том, что во время сортировки, при сравнении полей записи, меняются местами не поля записи, а элементы индексного массива.
Рассмотрим на конкретном примере механизм метода на рисунке
Расположение данных Содержание индексного файла.
в файле до сортировки после сортировки
1 |
Иванов |
|
2 |
Сидоров |
|
3 |
Шумов |
|
4 |
Архипов |
|
5 |
Петров |
|
6 |
Волков |
|
Порядок вывода данных при просмотре
1 |
|
4 |
2 |
|
6 |
3 |
|
1 |
4 |
|
5 |
5 |
|
2 |
6 |
|
3 |
1 |
Архипов |
2 |
Волков |
3 |
Иванов |
4 |
Петров |
5 |
Сидоров |
6 |
Шумов |
Словесный алгоритм индексной сортировки:
Открыть файл БД на чтение.
Определить количество записей в файле N
Если нет индексного файла, то инициализируется индексный массив index (в порядке упорядочивания в диапазоне от 1 до N), иначе данные переписываются в индексный массив.
i=0
Устанавливаем файловый указатель на i-ую запись.
Читаем i-ую запись из файла
j=i+1
Устанавливаем файловый указатель на j-ую запись
Читаем j-ую запись из файла
Сравниваем поле i-ой и j-ой записи
Если эти поля не соответствуют упорядочиванию, то меняются местами i-ый и j-ый элементы индексного массива
Если j<N-1, то j=j+1 и переход на п.8
Если i<N-1, то i=i+1 и переход на п.5
Записать индексный массив в индексный файл (если есть необходимость).
Вывести записи на экран монитора в соответствии с индексным массивом. Пример:
for(i=0; i<n; i++)
{
fseek(fp, index(i), SET_SEEK);
fwrite(&zp, sizeof(bd),1,fp);
viv_zp(…); {вывод записи на экран монитора}
}