Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Файлы.doc
Скачиваний:
5
Добавлен:
12.11.2019
Размер:
517.12 Кб
Скачать

8.6.3. Двоичные нетипизированные файлы

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

  1. Описание файловой переменной и сопостовление её файлу уже рассмотрено нами.

  2. Открытие файла для чтения или записи содержит дополнительный параметр, определяющий размер единицы информации (в байтах), используемой для обмена данными программы и операционной системы:

Reset(<файловая переменная>, <Размер единицы информации>);

Rewrite(<файловая переменная>, <Размер единицы информации>);

3. Чтение информации из файла и запись информации в файл осуществляется, соответственно, процедурами Block Read (англ. Read Block – прочитать блок информации) и Block Write (англ. Write Block – записать блок информации), имеющими следующие параметры:

Block Read (<файловая переменная>, <приемник информации>, <количество единиц информации>);

Block Write (<файловая переменная>, <источник информации>, <количество единиц информации>);

В качестве параметров Приёмник информации и Источник информации могут использоваться переменные любого типа, в том числе и области данных, на которые ссылаются нетипизированные указатели, что позволяет сохранять в файлах спрайты. Параметр количество единиц информации указывает размер читаемых и записываемых данных в единицах информации, размер которых указан при открытии файла процедурой Reset или Rewrite.

Рекомендуется при открытии файлов указывать в качестве Размера единиц информации число 1, тогда при вызове процедур Block Read и Block Write параметр Количество единиц информации будет равен размеру переменной, заданной в качестве параметра Приёмник информации для процедуры Block Read или Источник информации для процедуры Block Write. Размер переменной можно определить с помощью функции Size Of (англ. Size Of… - размер чего-либо), возвращающей размер в байтах переменной, заданна в качестве параметра:

Size Of(<переменные>)

4. Закрытие файла производиться обычным образом – вызовом процедуры Close.

Приведем пример записи информации в двоичных нетипизированный файл и чтение её обратно (см. листинг 202).

Листинг 202. Запись информации в двоичный нетипизированный файл

Program WriteUTBin;

Var

I: integer;

S: string;

F: file;

Begin

Assingn (F, ‘ untyped. bin’);

{сопоставление файлов переменной F файлу untyped. bin}

Rewrite (F, 1);

{открытие файла untyped. bin для записи, размер единицы информации для обмена – 1 байт}

S := ‘Ветер жизнь в природу вдохнул’;

BlockWrite (F, S, SizeOf (S));

{запись в файл строки, для определения размера строки использована функция SizeOf c параметром – именем переменной S, записываемой файл}

I := 15;

BlockWrite (F, I, SizeOf (I));

{Запись в файл числа, для определения размера числа использована функция SizeOf с параметром – имени переменной I, записываемой в файл}

Close (F);

{закрытие файла}

End.

Теперь напишем программу, читающую записанную информацию (см. листинг 203).

Листинг 203. Чтение информации из двоичного нетипизированного файла

Program ReadUTBin;

Uses crt;

Var

I: integer;

S: string;

F: file;

Begin

ClrScr;

Assingn (F, ‘ untyped. bin’);

{сопоставление файлов переменной F файлу untyped. bin}

Reset (F, 1);

{открытие файла untyped. bin для чтения, размер единицы информации для обмена – 1 байт}

BlockRead (F, S, SizeOf (S))

{чтение из файла строки, для определения размера строки использована функция SizeOf c параметром – именем переменной S, читаемой из файла}

BlockRead (F, I, SizeOf (I));

{чтение из файла числа, для определения размера числа использована функция SizeOf с параметром – имени переменной I, читаемой из файла}

Close (F);

{закрытие файла}

Writeln (‘String: ‘, S);

Writeln (‘Number: ‘, I);

{вывод на экран данных, прочитанных из файла}

ReadKey;

End.

Вспомогательные операции с файлами

Определение размера файла

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

Изменим программы сохранения измерений температуры и вычисления среднего значения так, чтобы информация хранилась в двоичном типизированном файле. Элементы файла будут иметь тип Real.

Program WriteTemps;

Uses Crt;

Var

T: real;

TNumber: Integer;

i: Integer;

F: File of real;

Begin

ClrScr;

Write(‘Введите количество измерений температуры: ’);

Readln(TNumber);

{Ввод количества измерений, которые необходимо сохранить в файл}

Assign(F, ‘temps.bin’);

{Сопоставление файловой переменной файлу temps.bin, файл считается текстовым}

Rewrite(F);

{Открытие файла temps.bin для записи}

For i:=1 to TNumber Do

begin

{Цикл по количеству измерений введенному пользователем в переменную TNumber}

Write(‘Введите измерение номер ’, i , ‘: ’);

Readln(T);

{Ввод очередного значения с клавиатуры}

Write(F, T);

{Запись введенного значения в файл}

End;

Close(F);

Writeln(‘Информация успешно сохранена.’);

ReadKey;

End.

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

Задание. По программному коду выделите разницу в программах:

_________________________________________________________

_________________________________________________________

_________________________________________________________

Описание файловой переменной – вместо типа Text используется тип File of Real.

Вместо процедуры записи в файл Writeln используется Write – числа записываются в файл в одну строку.

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

Листинг 207. Чтение из двоичного типизированного файла произвольного количества чисел

Program ReadTemps;

Uses crt;

Var

T, Sum: Real;

TNumber: Integer;

f: File Of Real;

Begin

ClrScr;

Assign(f, ‘temps.bin’); {сопоставление файловой переменной файлу temps.bin}

Reset(f); {открытие файла для чтения}

Sum:=0; {обнуление переменной, в которой будет содержаться сумма прочитанных чисел}

TNumber:=0; {обновление счётчика прочитанных чисел}

While not EOF(f) do {условный оператор цикла, условие продолжения – «не достигнут конец файла»}

Begin

Read(f, T); {чтение из файла одного числа в переменную T}

Sum:=Sum+T; {увеличение суммы прочитанных чисел}

TNumber:=:=TNumber + 1; {увеличение счётчика прочитанных чисел}

End;

Close(f); {закрытие файла}

Writeln(‘Средняя температура: ‘. Sum/TNumber: 0:3; {вывод на экран среднего значения рассчитываемого по формуле Sum/TNumber (сумма делится на количество чисел); формат вывода на экран – три цифры после десятичной запятой}

Readkey;

End.

Однако для двоичных файлов предусмотрен ещё один способ определения длины файла, часто более удобный в использовании, чем функция EOF. Процедура FileSize (от англ. Size OF File – размер файла) возвращает размер файла, заданного ей в качестве параметра:

FileSize(<файловая переменная>)

Для двоичных типизированных файлов данная функция возвращает количество элементов в файле, а для двоичных нетипизированных – количество единиц информации, используемых для обмена программы с операционной системой. Размер таких единиц задаётся при открытии файла для чтения или записи с помощью, соответственно, процедур Reset и Rewrite.

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

Изменим предыдущую программу чтения информации и вычисления среднего значения (см. листинг 208).

Листинг 208. Чтение из двоичного типизированного файла произвольного количества чисел

Program ReadTemps;

Uses crt;

Var

T, Sum: Real;

i: Integer;

f: File Of Real;

Begin

ClrScr;

Assign(f, ‘temps.bin’); {сопоставление файловой переменной файлу temps.bin}

Reset(f); {открытие файла для чтения}

Sum:=0; {обнуление переменной, в которой будет содержаться сумма прочитанных чисел}

For i:=1 to FileSize(f) do {безусловный цикл по количеству элементов в файле}

Begin

Read(f, t); {чтение из файла одного числа в переменную T}

Sum:=Sum+T;

End;

Writeln(‘Средняя температура: ‘. Sum/FileSize(f) :0:3; {вывод на экран среднего значения рассчитываемого по формуле Sum/FileSize (сумма делится на количество чисел); формат вывода на экран – три цифры после десятичной запятой}

Close(f); {закрытие файла}

Readkey;

End.

Как видно, программа стала немного короче. Заметим, что строка программы, в которой производится расчёт средней температуры и вывод её на экран, перенесена выше, чтобы находиться перед закрытием файла, иначе обращение к функции FileSize недопустимо.