Двоичные файлы содержат информацию, аналогичную по строению информации в оперативной памяти. Чтение и запись двоичных типизированных файлов осуществляется, соответственно, процедурами 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.