С термином «файл» вам уже приходилось встречаться. Прежде всего это понятие обычно связывают с информацией на устройствах внешней памяти. В Паскале понятие файла употребляется в двух смыслах:
• как поименованная информация на внешнем устройстве (внешний файл);
• как переменная файлового типа в Паскаль-программе (внутренний файл).
В программе между этими объектами устанавливается связь. Вследствие этого все, что происходит в процессе выполнения программы с внутренним файлом, дублируется во внешнем файле. С элементами файла можно выполнять только две операции: читать из файла и записывать в файл.
Файловый тип переменной — это структурированный тип, представляющий собой совокупность однотипных элементов, количество которых заранее (до исполнения программы) не определено.
Структура описания файловой переменной:
Var <имя переменной>: File Of <тип элемента>;
где <тип элемента> может быть любым, кроме файлового.
Например:
Var Fi: File Of Integer;
Fr: File Of Real;
Fc: File Of Char;
Файл можно представить как последовательную цепочку элементов (эл.), пронумерованных от 0, заканчивающуюся специальным кодом, называемым маркером конца (<м. к.>):
Количество элементов, хранящихся в данный момент в файле, называется его текущей длиной. Существует специальная ячейка памяти, которая хранит адрес элемента файла, предназначенного для текущей обработки (записи или чтения). Этот адрес называется указателем или окном файла.
Для того чтобы начать запись в файл, его следует открыть для записи. Это обеспечивает процедура Rewrite (FV); где FV — имя файловой переменной. При этом указатель устанавливается на начало файла. Если в файле есть информация, то она исчезает. Схематически выполнение процедуры Rewrite можно представить так:
Стрелка внизу отмечает позицию указателя.
Запись в файл осуществляется процедурой Write (FV, V); где V — переменная того же типа, что и файл FV. Запись происходит туда, где установлено окно (указатель). Сначала записывается значение, затем указатель смещается в следующую позицию. Если новый элемент вносится в конец файла, то сдвигается маркер конца. Схема выполнения оператора:
Пример 1. В файловую переменную Fx занести 20 вещественных чисел, последовательно вводимых с клавиатуры.
Var Fx: File Of Real;
X: Real; I: Byte;
Begin
Rewrite(Fx);
For I:=1 To 20 Do
Begin
Write ('?'); ReadLn(X);
Write(Fx,X)
End
End.
Для чтения элементов файла с его начала следует открыть файл для чтения. Это делает процедура Reset (FV).
В результате указатель устанавливается на начало файла. При этом вся информация в файле сохраняется. Схема выполнения процедуры:
Чтение из файла осуществляется процедурой Read (FV,V); где V — переменная того же типа, что и файл FV. Значение текущего элемента файла записывается в переменную V; указатель смещается к следующему элементу.
Доступ к элементам файла может быть последовательным или прямым. В стандартном Паскале реализован только последовательный доступ.
Принцип последовательного доступа: для того чтобы прочитать п-ю запись файла, сначала нужно прочитать все предыдущие записи с 1-й по (п-1)-ю.
Пример 2. В переменной х получить 10-й элемент вещественного файла Fx.
Program А;
Var Fx: File Of Real;
X: Real;
Begin
Reset(Fx) ;
For I:=l To 10 Do Read(Fx,X)
End.
Функция Eof (FV) проверяет маркер конца файла (end of file). Это логическая функция, которая получает значение true, если указатель установлен на маркер конца, в противном случае — false.
Пример 3. Просуммировать все числа из файла Fx, описанного в предыдущем примере.
Reset(Fx) ;
Sx:=0;
While Not Eof(Fx) Do
Begin
Read(Fx,X) ;
Sx:=Sx+X
End;
To же самое с помощью цикла Repeat можно делать следующим образом:
Repeat
Read(Fx,X);
Sx:=Sx+X
Until Eof(Fx);
Во втором варианте возможна ошибка чтения, если файл Fx пустой. Первый вариант от такой ошибки застрахован, поэтому он более предпочтителен.
Внешние файлы. В Турбо Паскале все внешние устройства (дисплей, клавиатура, принтер, диски и т.д.) трактуются как логические устройства с файловой структурой организации данных. Все немагнитные внешние устройства однофайловые. Иначе говоря, с каждым из них связан один файл со стандартным именем, предназначенный для обмена с внутренней памятью ЭВМ текстовой (символьной) информацией.
Стандартные имена логических устройств определяются операционной системой, в среде которой работает Паскаль. В системе MS DOS определены следующие имена:
CON (консоль) — логическое устройство, связанное при вводе с клавиатурой, при выводе — с экраном;
PRN (принтер) — логическое имя файла, связанного с устройством печати;
AUX — логическое имя коммуникационного канала, который используется для связи ПК с другими машинами;
INPUT — логическое имя стандартного устройства ввода, связанного с клавиатурой; при этом вводимые с клавиатуры символы отражаются на экране дисплея;
OUTPUT — логическое имя стандартного устройства вывода на экран.
Магнитный диск (МД) - многофайловое устройство. На нем хранятся как стандартные (системные) файлы, так и файлы, создаваемые пользователем. На магнитном диске могут создаваться файлы любых типов. Файлы на МД используются как в режиме чтения, так и в режиме записи.
Список файлов на диске хранится в директории (каталоге) диска. Каталог вызывается на экран системной командой DIR. В полной форме каталог содержит идентификаторы файлов, объем занимаемой памяти, дату и время создания файла. Идентификатор файла состоит из имени и типа файла:
<имя файла>.<тип файла>
Имя содержит от 1 до 8 латинских букв и (или) цифр; тип — необязательный элемент (от 0 до 3 символов), указывающий на характер информации, хранимой в файле.
Например:
PROGRAM. PAS — в файле текст программы на Паскале;
NUMBER. DAT — файл числовых данных;
NAMES. ТХТ — текстовый файл.
Для организации связи между файловой переменной и внешним файлом в Турбо Паскале используется процедура назначения:
Assign (<имя файловой переменной>,
<идентификатор внешнего файла>);
Здесь <идентификатор внешнего файла> — строковая величина (константа или переменная). Например:
Assign(Fi,'Number.dat');
После выполнения процедур Assign и Rewrite создается новый внешний файл, имя которого заносится в директорию.
Если файл открывается для чтения (Assign и Reset), то в указанном каталоге уже должен содержаться указанный внешний файл. В противном случае будет обнаружена ошибка.
Работа с файлом в программе завершается его закрытием с помощью процедуры
Close (<имя файловой, переменной>)
Например:
Close(Fi)
Подведем итог. Для создания и заполнения файла требуется следующая последовательность действий:
1. Описать файловую переменную.
2. Описать переменную того же типа, что и файл.
3. Произвести назначение (Assign).
4. Открыть файл для записи (Rewrite).
5. Записать в файл данные (Write).
6. Закрыть файл (Close).
Пример 4. Создать файл, содержащий среднесуточные температуры за некоторое количество дней. При этом необязательно предварительно указывать количество чисел во вводимой информации
Можно договориться о каком-то условном значении, которое будет признаком конца ввода. Пусть, например, признаком конца ввода будет число 9999.
Program Taskl;
Var Ft: File Of Real; T: Real;
Begin
Assign(Ft,'Temp.dat'); Rewrite(Ft);
WriteLn('Вводите данные. Признак конца - 9999');
ReadLn(T);
While T<>9999 Do
Begin
Write(Ft,T); Write ('?'); ReadLn(T)
End;
WriteLn ('Ввод данных закончен");
Close(Ft)
End.
В результате работы этой программы на диске будет создан файл с именем Temp. dat, в котором сохранится введенная информация.