- •Файлы: понятие, причины использования. Носители для хранения файлов
- •Структура дисковых носителей
- •Именование файлов
- •Понятие файла в Pascal
- •Классификация файлов
- •Механизм работы с файлами
- •Описание файловой переменной
- •Сопоставление файловой переменной файлу на диске
- •Открытие файла
- •Добавление информации в файл.
- •Чтение или запись файла
- •Добавление информации в файл
- •Закрытие файла
- •Чтение и запись текстовых файлов. Добавление информации в текстовый файл
- •Добавление информации в текстовый файл
- •Определение размера текстового файла
- •Задание значений переменных генератором случайных чисел Решение задач по теме «Файлы»
- •Двоичные типизированные файлы
- •8.6.3. Двоичные нетипизированные файлы
- •8.7.2. Изменение текущего элемента
- •Добавление информации в файл
- •Работа с файловой системой
- •Обобщение систематизация. Контрольные вопросы и ответы
8.6.3. Двоичные нетипизированные файлы
Методы работы с двоичными нетипизированными файлами существенно отличаются от методов работы с текстовыми и двоичными типизированными файлами, являются более сложными, однако и предоставляют более развитые возможности. Рассмотрим особенности использования файлов данного типа.
Описание файловой переменной и сопостовление её файлу уже рассмотрено нами.
Открытие файла для чтения или записи содержит дополнительный параметр, определяющий размер единицы информации (в байтах), используемой для обмена данными программы и операционной системы:
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 недопустимо.