Главная / Лекции / Основы алгоритмизации и программирования

Содержание данной главы
Модуль 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. Сортировка файлов без записи в память, т.е. на внешних устройствах.
Третий прием может быть реализован следующими способами:
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;


назад     содержание     вперед     на главную


Rambler's Top100
Hosted by uCoz