Двоичные файлы содержат информацию, аналогичную по строению информации в оперативной памяти. Чтение и запись двоичных типизированных файлов осуществляется, соответственно, процедурами Read и Write (формы Readln и WriteLn не используется, так как файлы являются двоичными, следовательно, не содержат в себе каких-либо строк). Тип данных, записываемых в файл, должен строго соответствовать типу, заявленному в описании файловой переменной.
Read (<Файловая переменная>, <приемник информации1>,., <приемник информации n>);
Write (<Файловая переменная>, <приемник информации1>,., <приемник информации n>);
В отличие от работы с экраном и текстовыми файлами, в качестве параметра Источник информации должны использоваться переменные. Использование констант недопустимо.
Рассмотрим пример записи в двоичный файл с элементами типа Integer десяти целых чисел, вводимых пользователем с клавиатуры (см. Листинг 198).
Листинг 198. Создание двоичного типизированного файла
Program WriteTBinFile;
Uses
Crt;
Var
| f: File of Integer; | {описание файловой переменной с именем f для работы с двоичными типизированными файлами, элементы которых имеют тип Integer} |
| I: integer; | |
| A: integer; | |
| Begin | |
| ClrScr; | |
| Assign(f, ‘numbers.bin’); | {сопоставление файловой переменной f файлу с именем numbers.bin, находящемуся в текущем каталоге} |
| Rewrite(f); | {открытие файла, которому сопоставлена переменная f (numbers.bin) для записи} |
| For i:=1 to 10 do | |
| Begin | |
| Write(‘Введите число’); | |
| Readln(a); | {ввод пользователем целого числа} |
| Write(f, a); | {запись введенного числа в файл} |
| end; | |
| Close(f); | {закрытие файла, которому сопоставлена переменная f} |
End.
Теперь прочитаем все десять чисел из файла, созданного программой и выведем их на экран (см. Листинг 199).
Листинг 199. Чтение двоичного типизированного файла
Program ReadTBinFile;
Uses
Crt;
Var
| f: File of Integer; | {описание файловой переменной с именем f для работы с двоичными типизированными файлами, элементы которых имеют тип Integer} |
| I: integer; | |
| A: integer; | |
| Begin | |
| ClrScr; | |
| Assign(f, ‘numbers.bin’); | {сопоставление файловой переменной f файлу с именем numbers.bin, находящемуся в текущем каталоге} |
| Reset(f); | {открытие файла, которому сопоставлена переменная f(numbers.bin) для чтения} |
| WriteLn; | |
| For i:=1 to 10 do | |
| Begin | |
| Read(f, a); | {чтение числа из файла} |
| WriteLn(‘Прочитано число: a); | {вывод числа, прочитанного из файла} |
| end; | |
| Close(f); | {закрытие файла, которому сопоставлена переменная f} |
ReadKey;
End.
Таким же образом записываются в файл сложные типы данных. Например, создадим файл, каждый элемент которого будет иметь тип данных «запись», состоящий из трех строковых полей (см. листинг 200)
Листинг 200. Запись двоичного типизированного файла с элементами сложного типа данных
Program WriteRecords;
Uses
CRT;
Type
TName = Record
Name: String;
Patronymic: String;
SurName: String;
end; {описание типа данных запись из трёх полей строкового типа}
Var
NameFile: File Of TName;
{описание файловой переменной с именем NameFile
для работы с двоичными типизированными файлами,
элементы которых имеют тип TName}
Name: TName; {описание переменной типа TName}
Begin
ClrScr;
| WriteLn (‘Введите фамилию: ’) | {вывод строки на экран} |
| Read (Name. SurName) | {чтение строки с клавиатуры} |
| WriteLn (‘Введите имя: ’) | {вывод строки на экран} |
| Read (Name. Name) | {чтение строки с клавиатуры} |
| WriteLn (‘Введите отчество: ’) | {вывод строки на экран} |
| Read (Name. Patronymic) | {чтение строки с клавиатуры} |
| Assign (NameFile, ‘names. bin’) |
{сопоставление файловой переменной NameFile
файлу с именем names. bin}
| Rewrite (NamesFile); {открытие файла для чтения} |
| Write (NameFile, Name); {запись переменной Name в файл, которомуСопоставлена переменная NameFile} |
| Close (NameFile); {закрытие файла} |
| End. |
Напомним, что тип файла – это условность, имеющая смысл только в подпрограмме его чтения или записи. Записав файл с элементами типа Integer, можно открыть его как файл с элементами, например, Byte.
Приведём такой пример (см. листинг 201).
Листинг 201. Запись и чтение двоичного типизированного файла
Program ReadWriteBin;
Uses
CRT;
Var
B1: File Of Integer;
{описание файловой переменной с именем В1
для работы с двоичными типизированными файлами,
элементы которых имеют тип Integer}
B2: File Of Byte;
{ описание файловой переменной с именем В2
для работы с двоичными типизированными файлами,
элементы которых имеют тип Byte}
V: Byte;
I: Integer;
Begin
Assign (B1, ‘names. bin’);
{сопоставление файловой переменной B1 файлу
с именем names.bin; элементы файла рассматриваются
как элементы типа Integer}
| Rewrite(B1); {открытие файла для чтения } |
| I:= 12000; |
| Write (B1, I); {запись в файл, которому сопоставлена |
| переменная NameFile, значения 12000} |
| Close (B1); {закрытие файла} |
ClrScr;
Assign ( B2, ‘names.bin’ );
{сопоставление файловой переменной B2 файлу
с именем names.bin; элементы файла рассматриваются
как элементы типа Byte}
| Reset (B2); | {открытие файла для чтения} | |
| Read (B2, V); | {чтение значения переменной V из файла} | |
| Write (V); | {вывод значения переменной V на экран} | |
| Close(B2); | {закрытие файла} |
ReadKey;
End.
Приведённый пример вполне корректен с точки зрения языка программирования. В первой её части создаётся файл, содержащий целочисленное значение 12000, занимающее два байта. Далее производится считывание первого байта в переменную V. Однако никакого прикладного значения такая программа не имеет, так как основное правило работы с информацией – информация, записанная в какой–либо форме, должна быть прочитана в той же самой форме. А число, выдаваемое на экран – 224.