- •10. Файлы
- •Введение
- •10.2. Классификация файлов в турбо-паскале
- •10.3. Объявление файла
- •10.4. Открытие и закрытие файла
- •10.5. Чтение и запись
- •10.6. Текстовые файлы
- •Program Demo; {Вывод на экран чисел из файла}
- •10.7. Нетипизированные файлы
- •10.8. Пример. Программа работы с файлами
- •Фамилия _
- •Фамилия Оценка 1 Оценка 2 Оценка 3
10.4. Открытие и закрытие файла
Основные операции с файлами – чтение из файла и запись в него. Перед этим файл необходимо открыть, а после завершения работы с файлом его необходимо закрыть. Этой цели служат следующие процедуры:
reset(<файловая переменная>); |
открыть файл для чтения (такой файл считается входным) |
rewrite(<файловая переменная>); |
открыть файл для записи (такой файл считается выходным) |
close(<файловая переменная>); |
закрыть файл |
Процедура reset открывает существующий физический файл, который связан с файловой переменной. При открытии указатель текущей записи файла устанавливается в его начало (на первый элемент). Для наглядности последующего изложения материала используем следующий образ: с файлом связано «окно», через которое виден один его элемент. После открытия файла для чтения, его «окно» устанавливается на первый элемент, если файл существует и не пуст.
Если файл не существует (в той директории, которая указана в процедуре Assign), возникает ошибка времени исполнения, и программа аварийно завершается по инициативе операционной системы. Эту реакцию операционной системы (ее называют стандартной реакцией операционной системы) можно подавить, предоставив программе возможность самостоятельно отреагировать на ошибку (открытия).
Для этого в среде MS DOS используется специальная директива компилятора {$I-}, которая должна быть помещена перед вызовом процедуры reset. Она означает следующее: «выключить стандартную реакцию операционной системы на ошибку ввода/вывода». При этом факт ошибки регистрируется, но выполнение программы продолжается. В программе можно установить, успешно или неудачно выполнилась процедура открытия, воспользовавшись функцией IOResult, которая возвращает значение 0, если операция закончилась успешно, и ненулевое значение (код ошибки) в противном случае.
Е
EOF(<файловая
переменная>);
Она возвращает значение FALSE, если «окно файла» указывает на имеющийся элемент, и значение TRUE, если «окно» вышло за пределы файла (за последний элемент его).
Процедура rewrite создает новый (пустой) физический файл. Если такой физический файл уже существует, он уничтожается, а вместо него создается новый пустой файл. При открытии «окно файла» устанавливается в той позиции, в которую будет произведена запись первого элемента (в момент выполнения операции записи в файл).
Процедура close разрывает связь логического и физического файлов. После этого можно использовать файловую переменную для связи с другим файлом или, при необходимости, для изменения статуса логического файла (например, вместо входного сделать файл выходным).
10.5. Чтение и запись
Процедуры чтения и записи – применительно к операциям с файлами были приведены в разделе «Кодирование вычислительных операций». Тем не менее, повторно приведем их структуру:
read(<ф.п.>,<имя переменной>); |
присвоить переменной значение, прочитанное из файла |
write(<ф.п.>,<имя переменной>); |
записать в файл значение переменной |
Здесь ф.п. – файловая переменная.
После выполнения любой из приведенных операций «окно файла» смещается на следующий элемент файла. Именно в этом случае, при чтении из файла, когда окно выходит за пределы файла, возникает ситуация «Конец файла». При этом, естественно, операцию чтения из файла выполнить невозможно, и попытка чтения вызывает аварийное завершение программы.
Н
{
Вычислить и вывести на экран сумму
целых чисел, } {
являющихся элементами типизированного
файла } Program
FSumm; var fl
: file
of
integer; x
: integer; sum:
longint; begin
Assign(fl,’myfile.dat’); {$I-}
{выключить стандартную реакцию
на
ошибку ввода/вывода}
reset(fl); {$I+}
{включить стандартную реакцию
на
ошибку ввода/вывода} if
(IOResult<>0)
then
writeln(’Ошибка
открытия файла. Конец работы.’) else
begin
{Вычисление
суммы элементов файла} Sum
:= 0;
while
(not
EOF(fl)) do
begin read(fl,
x); Sum
:= Sum + x;
end; Close(fl);
writeln(’Сумма
элементов
файла
= ’,Sum); end; end.