- •1.1. Основные этапы создания программы
- •1.2. Алгоритмы
- •2.1. Структура типов в Turbo Pascal
- •Стандартные скалярные типы. Типы целых чисел
- •2.3. Операции побитовой обработки
- •2.4. Представление вещественных чисел в эвм
- •2.5. Символьный тип
- •2.6. Булевский тип
- •2.7. Перечисленный тип
- •2.8. Интервальный тип (диапазон)
- •3.1. Структура программы на turbo pascal
- •3.2. Основные операторы языка
- •3.2.1. Простые операторы
- •3.2.2. Операторы ввода-вывода
- •3.2.3. Структурные операторы
- •3.2.4. Условные операторы
- •3.2.5. Операторы повтора (цикла)
- •4.1. Массивы
- •4.2. Строковый тип
- •4.3. Множества
- •5.1. Процедуры и функции
- •5.2. Процедуры и функции пользователя
- •5.3. Передача параметров по значению и по ссылке
- •5.4. Рекурсивные процедуры и функции
- •6.1. Структура модулей
- •6.2. Компиляция и использование модулей
- •7.1. Записи
- •7.2. Вложенные записи
- •7.3. Записи с вариантами (вариантные записи)
- •7.4. Файлы
- •7.5. Подпрограммы для работы с файлами
- •7.5.1. Процедуры
- •7.5.2. Функции
- •7.6. Примеры программ для обработки файлов
- •7.7. Текстовые файлы
- •8.1. Структура оперативной памяти для программ на Turbo Pascal
- •8.2. Динамические структуры данных
- •8.3. Основные процедуры и функции для работы с динамическими переменными
- •8.4. Динамика выделения памяти в куче
- •8.5. Линейные списки. Способы создания и обработки
- •8.6. Нелинейные списки. Способы создания и обработки
- •Библиографический список
- •Оглавление
- •394026 Воронеж, Московский просп., 14
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 тип) – уничтожает все компоненты файла, начиная с места текущего положения указателя и подготавливает файл для записи.