Файл. Текстовый файл. Запись в файл. Чтение из файла. Типизированные файлы, страница 4

ind : index;

countgroup : integer;

begin

reset (filedata);

rewrite (binfile);

countgroup : = 0;

repeat

ind := 1;

геаd (filedata, binfile ­ [ind]);

if not еоf filedata then

begin

repeat

ind := ind + 1;

геаd (filedata, binfile ­ [ind]);

until (ind = sizegroup) or eof (filedata);

if еоf (filedata)

then writeln ('Последняя группа в файле не полна ')

else

begin

put (binfile);

countgroup ; = countgroup +1;

end;

end;

until eof (filedata);

writeln ('Преобразовано', countgroup, 'групп');

end. {convertgroup}


1.4  Типизированные файлы.

Описание типизированного файла имеет вид

var ftable : file of type_ID;

где type_ID может быть любым типом за исключением файлового. Элементами типизированного файла являются значения указанного типа.

При работе с типизированными файлами можно использовать процедуры Assign, Reset и Rewrite. Текстовый файл, открытый процедурой Reset, доступен только для чтения, а типизированный файл доступен как для чтения, так и для записи. Особенность использования процедур Read и Write для типизированных файлов заключается в том, что каждый из параметров в этом случае должен быть переменной типа type_ID, а выражения и константы недопустимы. Процедуры Readln и Writeln применяются только к текстовым файлам.

Типизированные файлы используются для хранения однородной по типу информации. Если речь идет о хранении числовых данных, следует использовать типизированные файлы, так как величина типизированного файла значительно меньше.

Для эффективного выполнения операций ввода/вывода из внешних файлов в Паскале целесообразно использовать нетипизированные файлы, так как при работе с ними можно использовать быстрые дисковые операции низкого уровня. Нетипизированные файлы дают возможность прямого доступа к любому файлу на диске независимо от его типа и структуры.

Описание нетипизированной файловой переменной имеет вид

var untyped_file : file;

Такая файловая переменная связывается с внешним файлом обычным образом. В числе параметров процедур Reset и Rewrite для нетипизированных файлов кроме файловой переменной имеется необязательный второй параметр типа Word, например:

Reset(untyped_file, n);

Дополнительный параметр n описывает размер индивидуальной записи в файле в байтах. Если параметр n отсутствует, его значение по умолчанию принимается равным 128.

Решим следующую задачу. Пусть имеется внешний файл, в котором хранятся вещественные числа. Требуется написать программу, которая считывает значения из файла и находит в этом файле второе по величине значение. Прежде всего необходимо определить, какой тип имеет файл, содержащий числовые значения. Будем считать, что это — текстовый файл, поскольку в этом случае проще выполнить проверку программы. Такой файл можно создать с помощью любого текстового редактора. При запуске программы необходимо ввести имя внешнего файла. Введенное строковое значение присваивается переменной fi1e_name, которая связывается с файловой переменной in_filе. Затем файл открывается, числовые значения, содержащиеся в нем, считываются и выводятся на экран. Это делается для того, чтобы проверить работу программы. Затем с помощью процедуры Reset указатель возвращается в начало файла, и считывание значений повторяется. Используя операций сравнения и условные операторы, заносим в переменную L1 наибольшее значение, а в переменную L2 — второе по величине. Именно это значение и требовалось найти.

Программапоискавторогоповеличинезначениявтекстовомфайле

program second_largest;

var

t, L1, L2 : real;

file_name : String[9];

  in_file : text;

Begin

  WriteLn(‘Введите имя файла:');

  ReadLn(fi1e_name);

  Assign(in_fi1e, file_name);

Reset(in_file);

while not eof (in_file) do

begin

     Read ( in_file, t );

     WriteLn (t);

end;

   reset (in_file);

   Read (in_file, L1);

   Read (in_file, L2);

   if L1 < L2 Then

   Begin

       t := L1;

       L1:=L2;

       L2:=t;

   end;

  while not eof (in_file) do

begin

Read(in_fi1e, t);

if t > L1 then

begin

     L2:=L1;

     L1:=t;

end;

else if (t < L1) and (t > L2) then L2 := t;

end;

c1ose (in_file);