Операции для работы с файлами последовательного доступа
Множества значений или переменных с одним общим именем называются структурированными (составными) типами. Имеется несколько способов построения составных типов, каждый из которых отличается способом обращения к отдельным компонентам и, следовательно, способом обозначения компонентов, входящих в данные структурированных типов.
По способу организации и типу компонентов выделяют четыре основные разновидности структурированных типов:
· регулярный тип (массивы);
· комбинированный тип (записи);
· файловый тип (файлы);
· множественный тип (множества).
Использование структурированных типов данных позволяет решать разнообразные и достаточно сложные задачи.
В задачах, которые мы рассматривали, данные поступали с клавиатуры, а результаты выводились на экран дисплея. Поэтому ни исходные данные, ни результаты не сохранялись. Всякий раз при выполнении одной и той же программы, особенно во время ее отладки, приходилось заново вводить исходные данные. А если их очень много? Тогда удобно оформить исходные данные и результаты в виде файлов, которые можно хранить на диске точно так же, как и программы.
Файл − это область памяти на внешнем носителе, в которой хранится некоторая информация. В него можно поместить данные или извлечь их оттуда. Файл в таком понимании называют физическим файлом, т.е. существующим физически на некотором материальном носителе информации.
С другой стороны, файл − это одна из многих структур в программировании. Файл в таком понимании называют логическим файлом, т.е. существующим только в нашем логическом представлении при написании программы.
Структура физического файла представляет собой простую последовательность байт носителя информации.
Структура логического файла − это способ восприятия файла в программе. Образно говоря, это "шаблон" ("окно"), через который мы смотрим на физическую структуру файла. В Паскале таким "шаблонам" соответствуют типы данных, допустимые в качестве компонент файлов.
В языке Паскаль файл представляет собой последовательность элементов одного типа. Мы будем работать только с т.н. файлами последовательного доступа. В таких файлах, чтобы получить доступ к элементу, необходимо последовательно просмотреть все предыдущие.
Файл последовательного доступа можно сравнить с магнитной лентой, на которой записаны песни. Для того чтобы найти конкретную песню, надо перемотать кассету на начало и прослушивать песню за песней до тех пор, пока не будет найдена нужная.
Зачем нужны файлы? Объем информации, которую можно сохранить в файле, очень велик. Он значительно больше, чем объем, который можно хранить в оперативной памяти, например, при использовании массивов.
Файлы классифицируются по двум признакам:
По методу доступа − последовательный, прямой доступ.
По типу (логической структуре) − типизированные, текстовые, нетипизированные.
Объявление файловой переменной в разделе описания переменных имеет вид:
Var <имя файла>: File Of
<тип элементов;>
Например,
Var Ft: File Of Integer;
{файл, элементами которого являются целые числа}
М: File Of Char;
{файл, элементами которого являются символы}
Type File_Integer=File Of Integer;
File_Char=File Of Char;
Var F1: File_Integer;
F2: File_Char;
Так как в описании указывается тип элементов, такие файлы называются типизированными. Все элементы файла пронумерованы, начиная с нуля.
С каждым файлом связан так называемый файловый указатель. Это неявно описанная переменная, которая указывает на некоторый элемент файла.
(0) (1) … (k) (k+1) …
файловый указатель
Все операции производятся с элементом, который определен файловым указателем.
Обработка файлов
Связь переменной файлового типа с файлом на диске
Для установления связи между файловой переменной и файлом на диске имеется стандартная процедура Assign.
Assign(<имя файловой переменной>,
'<имя файла на диске>');
Например, Assign (F1,'A:INT.DAT');
После установления такого соответствия все операции, выполняемые над переменной F1, будут выполняться над физическим файлом, хранящимся на диске А и имеющим имя INT.DAT.
Файл в каждый момент времени может находиться в одном из двух состояний: либо он открыт только для записи, либо только для чтения.
Чтение из файла
Под чтением из файла понимается пересылка данных из внешнего файла, находящегося на диске, в оперативную память.
Для чтения из файла необходимо открыть файл для чтения посредством процедуры
Reset (<имя файловой переменной>);
Собственно чтение данных из файла выполняется процедурой
Read (<имя файловой переменной>,
<имя переменной>);
Переменная должна иметь тот же тип, что и компоненты файла. Отметим, что если оператор ввода имеет вид Read(<имя переменной>), то данные вводятся с клавиатуры, а если Read (<имя файловой переменной>, <имя переменной>), то данные вводятся из файла, хранящегося на диске.
Закрытие файла
После того как данные из файла прочитаны, его необходимо закрыть посредством процедуры
Close (<имя файловой переменной>).
Общая схема чтения данных из файла, таким образом, следующая:
Reset (<имя файловой переменной>);
…
Read (<имя файловой переменной>,
<имя переменной>);
…
Close (<имя файловой переменной>);
Признак конца файла
Так как число элементов файла не известно заранее, необходимо уметь определять, что файл кончился. Для этого используется логическая функция
EOF(<имя файловой переменной>)
(EOF - End Of file). Она принимает истинное значение (True), если достигнут конец файла, и ложное (False) − в противном случае.
Пример
Прочитаем из файла целые числа и выведем их на экран:
ProgramExample_82;
Var F1: File of Integer;
n: Integer;
Begin
Assign(F1, 'A:INT.DAT');
{связываем файловую переменную с файлом
на диске}
Reset(F1); {открываем файл для чтения}
While Not EOF(F1) Do
{пока не достигнут конец файла F1}
Begin
Read(F1, n);
{считываем очередное число}
Write(n,' '); {выводим его на экран}
End;
Close(F1); {закрываем файл}
Readln;
End.
Запись в файл
Под записью в файл понимается вывод результатов программы из оперативной памяти ЭВМ в файл на диске.
Для записи в файл необходимо открыть файл для записи посредством процедуры
Rewrite (<имя файловой переменной>);
Собственно запись данных в файл выполняется процедурой
Write (<имя файловой переменной>,
<значение>);
Если оператор вывода имеет вид Write(<значение>), то данные выводятся на экран дисплея, а если Write(<имя файловой переменной>,<значение>), то данные записываются в файл. После работы с файлом его необходимо закрыть.
Общая схема записи данных в файл, таким образом, следующая:
Rewrite(<имя файловой переменной>);
…
Write (<имя файловой переменной>,
<значение>);
…
Close(<имя файловой переменной>);
После выполнения процедур открытия файла для чтения или для записи (Reset или Rewrite) текущий указатель "смотрит" на первый элемент (элемент с номером 0).
§33. Прямой доступ к элементам файла
Несмотря на то, что в стандартном Паскале имеются лишь файлы последовательного доступа, Турбо Паскаль содержит процедуры и функции для более эффективной работы с файлами. В частности, имеется возможность осуществлять прямой доступ к элементам файла.
Установка указателя
Процедура
Seek (<имя файловой переменной>, N)
устанавливает файловый указатель на N-й элемент. Например, Seek (F1, 3). Напомним, что элементы файла нумеруются с нуля.
Определение номера элемента
Функция
FilePos (<имя файловой переменной>)
возвращает номер элемента, на который "смотрит" файловый указатель.
Пример
Найти номер элемента, с которым будет выполняться следующая операция.
Решение
Воспользуемся функцией FilePos:
N:=FilePos(F1).