double arrow

Значения полей, предназначенных для выполнения сортировки, должны быть приведены к строковому типу (string), если необходимо. Предположим, что они называются F1, F2 и F3.


Далее после преобразования они сцепляются в единую строку, причём в том порядке, в каком это задано для сортировки в постановке задачи, и результат записывается в поле SortField, например:

SortField := F1 + F3 + F2;

Только после формирования этого рабочего поля запись выводится в файл. И так для каждой записи основного файла.

Далее для выполнения сортировки в программе формируется массив записей размером в количество записей сортируемого файла. Записи файла читаются из файла и размещаются в данном массиве.

После этого выбирается алгоритм сортировки, например, метод обмена пар смежных записей, метод «пузырька». Соседние записи сравниваются между собой по значениям их полей SortField и, если надо, меняются местами целиком. Следует отметить, что сортировка выполняется сообразно значениям символьных строк, точно так же, как и сортировка строк по алфавиту.

В результате в памяти образуется рассортированный массив, который и переписывается обратно в основной файл.

Аналогичный приём может быть рекомендован при необходимости выполнения сортировки по датам.

Дата вводится как и принято – день, месяц, год в отдельные поля желательно типа string.

Далее, как и ранее в примере, в описание типа записи добавляется служебное поле SortField:string;

При формировании основной записи в это поле помещаются поля даты, сцепленные в таком порядке:

SortField:=Year + Month + Day;

Далее сортировка выполняется по описанному ранее алгоритму.

Файлы без типа.

Любой файл может быть представлен в виде последовательности символов кода ASCII. Турбо Паскаль позволяет рассматривать файл с любой организацией как бы состоящим из блоков по 128 байт.

Файлы без типа используются обычно при копировании файлов, когда не важна внутренняя структура записи файла. Если длина сегмента на диске 1024 байта, то количество блоков в группе равно 8 при длине блока 128 символов.

Обмен информацией происходит непосредственно между программой и файлом без использования буферной памяти. Адресация блоков производится по их номерам. Блоки в этом случае являются компонентами файла. Использование файлов без типа приводит к экономии памяти.

Для работы с такими файлами предусмотрены специальные процедуры, позволяющие производить обмен группами блоков по 128 символов.

BLOCKREAD(<имя файла>,<переменная>,<число компонентов>

[,<факт.число>]);

- для чтения блока из файла.

BLOCKwrite(<имя файла>,<переменная>,<число компонент>

[,<факт.число>]);

- для записи блока в файл.

Здесь:

<имя файла> - имя файла без типа;

<переменная>- имя переменной для чтения или записи;

<число компонент> -количество передаваемых компонент за один раз;

<фактическое число> -количество фактически переданных записей длиной 128 байт.

Файл для блочного ввода-вывода описывается с типом FILE. Для файла без типа нельзя использовать процедуры READи WRITE.

VAR

<имя файла > : FILE;

При открытии файла без типа можно указать длину записи файла в байтах. Она указывается вторым параметром при обращении к процедуре Resetили Rewrite,в качестве которого используется выражение типа Word.Если длина записи не указана, она принимается равной 128 байтам.

Рассмотрим пример блочного ввода-вывода. Пусть требуется скопировать данные из файла FromF в файл ToF.

Var

Fromfile, Tofile: file;

NR, NWr: Word;

NAME:STRING[12];

Buf: array[1..2048] of Char;

Begin

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

READLN(FILENAME);

Assign(Fromfile, FILENAME);

Reset(Fromfile, 1);

WRITE(' ВВЕДИТЕ ИМЯ ВЫХОДНОГО ФАЙЛА: ');

READLN(FILENAME);

assign(Tofile, FILENAME);

Rewrite(Tofile, 1);

Repeat

BlockRead(FromF, Buf, SizeOf(Buf), NR);

BlockWrite(ToF, Buf, NR, NWr);

until (NR = 0) or (NWr <> NR);

Close(Fromfile);

Close(Tofile);

End.

В примере программы при открытии файла без типа в вызове процедуры RESETуказана длина записи равная 1. В этом случае при копировании файла не будут записаны лишние символы в новый файл.


Сейчас читают про: