Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Praktikum_po_programmirovaniyu.doc
Скачиваний:
23
Добавлен:
09.12.2018
Размер:
2.5 Mб
Скачать

7.4. Файлы

В практике программирования часто встречаются задачи, решение которых носит регулярный характер и требует большого количества исходных данных, относительно мало изменяемых во времени. При решении подобных задач ввод данных с экрана весьма трудоемок. В этом случае используется концепция файла.

Файл – это поименованная область памяти на внешнем носителе, предназначенная для хранения информации.

С точки зрения языка Паскаль файл – это структурированный тип данных, состоящий из последовательности компонент одного и того же типа. Компонентами файла могут быть переменные любого типа, кроме файлового.

114

Каждый файл имеет свое уникальное имя и содержит компоненты одного типа. Длина вновь создаваемого файла (в отличие от массива) никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти.

Чтобы не путать файлы в программе и файлы на диске, переменные файлового типа называют логическими файлами, а реальные файлы на диске – физическими файлами.

Переменная файлового типа может быть определена стандартными способами:

type

tf: file of integer;

var

f: tf;

var f : file of integer;

Физически файл можно представить в виде бесконечного списка элементов одного и того же базового типа. Все элементы файла нумеруются, начиная с нуля.

0 1 2 3

Элем. 0

Элем. 1

Элем. 2

Элем.4

↑- текущий указатель

В каждый момент времени доступен только один элемент файла, на котором установлен указатель.

По способу доступа к элементам файла файлы подразделяются на файлы последовательного и прямого доступа.

Файлом последовательного доступа называется файл, доступ к элементам которого возможен только в той же

последовательности, в которой они записаны в файл. В файлах прямого доступа доступ осуществляется по адресу элемента.

В целях повышения эффективности обмена между внешними устройствами и переменными программы

115

используется специальная область памяти, называемая буфером. Буфер выделяется для каждого открытого файла. При записи в файл информация накапливается в буфере до тех пор, пока буфер не заполнится. Только после этого или после специальной команды сброса информация передается на внешнее устройство. При чтении из файла данные сначала считываются в буфер до его полного заполнения, а потом передаются в оперативную память.

7.5. Подпрограммы для работы с файлами

7.5.1. Процедуры

Все стандартные процедуры и функции Паскаля, обеспечивающие ввод-вывод данных, работают только с логическими файлами, то есть с файловыми переменными. Перед выполнением операций файловая переменная связывается с физическим файлом посредством процедуры:

Assign(var f:file of тип ; filename: string) связывает логический файл f с физическим файлом, имя которого задается переменной filename:

Assign(f, 'spisok.dat');

Assign(f, ‘d:\term\spisok.dat’);

Close(var f: file of тип) закрывает открытый логический файл. Закрытие файла необходимо при завершении работы с файлом, который был открыт для записи, поскольку при этом происходит выгрузка содержимого буфера. При отсутствии процедуры Close содержимое буфера может быть утеряно.

Erase(var f:file of тип) уничтожает физический файл, связанный с файловой переменной f. Файл перед вызовом этой процедуры должен быть закрыт процедурой Close.

Rename(var f:file of тип, newname:string) переименовывает файл на диске, связанный с логическим

116

файлом f. Операция переименования возможна после закрытия файла.

Rewrite(var f:file of тип) – открывает логический файл f для записи данных, устанавливая текущий указатель на нулевую позицию. Если физический файл, соответствующий файловой переменной f, существовал ранее, его содержимое уничтожается и текущий указатель устанавливается на нулевую позицию.

Reset( var f:file of тип) устанавливает текущий указатель на нулевую позицию, сохраняя содержимое файла без изменения. Если эту процедуру применить к несуществующему файлу, то возникнет ошибка ввода-вывода.

Например, следующий фрагмент программы проверяет наличие файла на диске:

var f: file of integer;

begin

assign(f,’a.dat’);

{$i-} {Отключаем контроль ошибок ввода-вывода}

Reset(f);

{$I+} {Включаем контроль ошибок ввода-вывода}

if IoResult<>0 then writeln( 'Файла с таким именем не существует’)

else writeln(‘Файл существует’); Close(f);

end.

Read(var f:file of тип, s:тип) – производит чтение из файла одного значения и присваивает это значение переменной s, тип которой совпадает с типом файла. После

выполнения этой процедуры текущий указатель файла смещается при этом на следующую позицию.

Seek(var f:file of тип, n:word) – устанавливает текущий указатель на позицию, определяемую параметром . При этом следует учитывать, что нумерация элементов файла начинается с нуля.

117

Write(var f:file of тип, s:тип) – записывает на позицию, на которой находится указатель, значение переменной, тип которой совпадает с типом файла. После выполнения этой процедуры текущий указатель файла смещается при этом на одну позицию.

Truncate(var f:file of тип) – уничтожает все компоненты файла, начиная с места текущего положения указателя и подготавливает файл для записи.