Содержание данной главы
Модуль 6. Файлы
6.1. Файлы.
Файл - это последовательность однотипных компонентов.
Компонентом файла может быть значение простого типа или структура, но не файл. Файл может быть компонентом другой структуры, но ни прямо, ни косвенно не может входить в состав другого файла.
Файл отличается от одномерного массива:
1) размещением на внешнем носителе;
2) произвольным в пределах носителя числом компонентов;
3) доступом к одному текущему компоненту в каждый момент времени.
В Паскале различают текстовые, типизированные и нетипизированные файлы.
При работе с файлами ключевым понятием является понятие файловой переменной.
Файловая переменная не является представлением одного конкретного файла. В зависимости от класса файла ее можно объявить одним из трех способов.
var
<ФП>: text;
<ФП>: file of <тип компонентов>;
<ФП>: file;
Для сопоставления файловой переменной с именем конкретного файла используется процедура assign (<ФП>, 'путь_к_файлу\имя_файла');
Процедура assign должна быть первой среди действий работы с файлом. Если файл находится в текущей директории, то путь к нему можно не указывать.
Файл, содержимое которого полностью заменяется, открывается процедурой rewrite (<ФП>). Файл, содержимое которого продолжает использоваться путем чтения, открывается процедурой reset (<ФП>).
Текстовые файлы могут быть открыты на дозапись процедурой append (<ФП>).
Для чтения компонентов файла используются процедуры read, readln и blockread. Первым аргументом в их списке стоит файловая перемнная, а затем обычный список вывода. Для записи компонентов в файл используются процедуры write, writeln и blockwrite.
После завершения работы с файлом его необходимо закрыть процедурой close (<ФП>).
Закрытый файл можно удалить erase (<ФП>) и переименовать rename (<ФП>, 'новое_имя').
Функция eof является логической и возвращает значение истина если достигнут конец файла. При работе с текстовыми файлами в конец каждой строки добавляется соответствующий знак, который можно найти, используя логическую функцию eoln. Этот символ в конец строки может быть поставлен принудительно. Для этого используется клавиша Enter.
Для набора текстовых файлов вне языка Паскаль можно использовать текстовый редактор edit.com.
Наряду с функциями eof и eoln могут использоваться seekeof (<ФП>) и seekeoln (<ФП>), "предчувствующие" окончание файла или строки, т.е. они распознают признак конца, если перед ним находятся пробелы или маркеры табуляции.
6.2. Сортировка файлов.
Для сортировок файлов можно воспользоваться несколькими приемами:
- Записать файл в массив. Отсортировать массив. Записать массив в файл;
- Используя динамические структуры создать в памяти структуру, подобную файлу. Отсортировать в этой структуре файл и переписать его заново;
- Сортировка файлов без записи в память, т.е. на внешних устройствах.
Третий прием может быть реализован следующими способами:
1) просматривается весь файл. Находится максимальный элемент. Записывается в новый файл. Старый файл переписывается без найденного элемента и т.д.
2) пузырьковая сортировка. Из файла читаются два элемента. Больший записывается в новый файл, а меньший в конец старого. Просматривается весь файл до конца. Созданный вновь файл сортируется тем же способом. Сортировка останавливается когда в сортируемый файл не производится записи.
3) сортировка слиянием. Сортировка проводится в два этапа. На первом этапе сортируемый файл разделяется на два по определенному признаку. Элементы в новых файлах будут отсортированы. На втором этапе созданные файлы сливаются, создавая общий порядок сортировки.
function order (x, y: integer): boolean;
begin
if x<y then order:=true else order:=false;
end;
procedure separator (s, d1, d2: file; var sort:boolean);
var a, b:integer;
last: boolean;
dirout: 1..2;
begin
reset (s);
rewrite (d1);
rewrite (d2);
sort:=true;
dirout:=1;
if not eof (s) then
begin
read (s, a);
while not eof (s) do
begin
read (s, b);
last:= not order (a, b);
case dirout of
1: write (d1, a, last);
2: write (d2, a, last);
end;
if last then begin
case dirout of
1: dirout:=2;
2: dirout:=1;
end;
sort:=false;
end;
a:=b;
end;
case dirout of
1: write (d1, a, true);
2: write (d2, a, true);
end;
end;
close (s);
close (d1);
close (d2);
end;
назад содержание вперед на
главную
|