- •Описание записи (record).
- •Работа с файлами. Общие сведения о файлах.
- •Процедуры и функции для работы с файлами.
- •Особенности обработки типизированных файлов.
- •Создание файла.
- •3. Добавление записей к файлу (в конец файла)
- •If { корректировка подтверждена }
- •If {…запись не удаляется…}
- •Корректировка с использованием последовательного доступа.
- •If {запись не корректируется}
- •О взаимосвязи записей основного обрабатываемого файла и записей файлов-справочников
- •Файлы без типа.
3. Добавление записей к файлу (в конец файла)
Файл может расширяться путем добавления в файл новых компонентов, например, за последним существующим компонентом файла.
Первый вариант добавления
1. Открывается новый, рабочий файл, затем основной файл, и все записи основного файла переписываются в новый файл последовательным доступом. После окончания основного файла в новый файл добавляются и новые записи, которые должны быть в него добавлены. Оба файла закрываются.
2. После закрытия обоих файлов возможны три варианта
а) содержимое нового файла просто переписывается в старый файл, новый файл уничтожается
б) переименование: новый файл получает имя старого файла, а старый файл уничтожается;
в) создание резервной копии: старый файл сохраняет прежнее имя, но получает новое расширение, например, ~.BAK (обычно такое расширение получает предыдущая версия файла, т.е. существовавшая до текущего изменения), а новый файл получает имя старого, основного файла. Таким образом, при неудовлетворительном результате сохраняется возможность возврата на исходные позиции – файлу ~.BAK нужно вернуть прежнее имя, включая и расширение, а новый файл можно уничтожить.
Второй вариант добавления записей к файлу (с использованием элементов прямого доступа).
Назначение процедуры SEEK( … ), FILESIZE(…);
Файл открывается для чтения (RESET). Далее необходимо обеспечить дописывание новых записей в файл вслед за последней записью. Для этого сначала используется процедура позиционирования указателя на позицию за последней записью файла :
SEEK (FILE_PROG, FILESIZE(FILE_PROG));
или так:
N := FILESIZE(FILE_PROG);
SEEK (FILE_PROG , N);
При этом указатель устанавливается за последней записью (компонентом) файла. После этого можно организовать обычный цикл формирования очередной записи и вывода её в файл до тех пор, пока пользователь не откажется от работы (см. пример создания файла).
Далее файл должен быть закрыт..
При работе с файлом возможен вариант, когда записи нужно добавить к рассортированному файлу, т.е. файлу, записи которого упорядочены по одному или нескольким признакам. При этом возможны такие варианты.
Вариант 1.
Записи основного файла упорядочены по некоторому ключевому признаку, одному или нескольким. Добавляемые записи также должны быть упорядочены по этому же признаку (признакам) и в этом же направлении (например, по возрастанию). Добавление может быть выполнено по тому же алгоритму, что и объединение двух одинаково рассортированных массивов в массив, рассортированный таким же образом.
. . .
{ фрагмент программы }
reset (f1);
reset (f2);
rewrite (F_rez);
read (f1, zap1);
read (f2, zap2);
While (not eof (f1)) and (not eof (f2)) do
begin
if zap1.priznak < ZAP2.PRIZNAK
then begin
write (f1, zap1);
read (f1, zap1);
end
else begin
write (f2, zap2);
read (f2, zap2);
end
end;
if eof (f1) = true { файл f1 закончился }
then begin
write (f_rez, zap1);
close (f1);
While (not eof(f2)) do
begin
read (f2, zap2);
write (f_rez, zap2);
end;
close (f2);
end
else if eof (f2) = true { файл f2 закончился }
then begin
write (f_rez, zap2);
close (f2);
While (not eof(f1)) do
begin
read (f1, zap1);
write (f_rez, zap1);
end;
close (f1);
end;
close (F_rez);
Полностью данный фрагмент копировать в программу нельзя, есть частные случаи объединения, не описанные в фрагменте!
Далее рассматриваются вариации «на заданную тему»
Вариант 2.
Из добавляемых записей можно сформировать динамический массив в оперативной памяти и рассортировать его. Далее можно упорядоченные добавляемые записи занести в другой файл, после чего объединить оба файла по рассмотренному алгоритму.
Вариант 3.
При наличии должного объёма оперативной памяти и относительно небольших объёмов основного файла и добавляемых записей можно использовать динамические массивы. Можно упорядоченные записи основного файла записать в динамический массив. Из добавляемых записей также можно сформировать свой динамический массив в оперативной памяти и рассортировать его, после чего объединить оба массива по рассмотренному алгоритму, а объединённый массив записать в результатный файл.
Вариант 4.
Записи просто добавляются в конец файла, без учёта сортированности. Далее производится сортировка записей всего файла (возможно с использованием динамического массива записей в оперативной памяти – если её хватает), после чего добавленные записи занимают свои места в общем файле.
Удаление записи из файла.
Удаление может быть выполнено по заданному признаку. Им может быть
порядковый номер записи в файле,
заданное значение ключевого признака, или
какой-то другой вариант.
Перед выполнением удаления необходимо предоставить пользователю возможность либо увидеть содержимое файла для выбора удаляемых записей (простейший вариант), либо сформировать перечень иным способом.
{ удаление записей из файла f1 }
{ фрагмент программы }
. . .
reset(f1);
rewrite (F_temp);
repeat
read(f1,zap);
