Удаление

Чтение

Запись

Открытие и позиционирование файла на начало

а) RESET(f) - для существующего файла

б) REWRITE(f) - для вновь создаваемого файла.

Для текстовых файлов

- только для чтения

RESET (f)

- для обновления

REWRITE (f)

Если необходимо добавить новые строки в конец уже существующего текстового файла, используют процедуру

APPEND(f),

которая не очищает файл, а только устанавливает текущий указатель

файла в его конец.

 

Типизированные и нетипизированные файлы допускают как чтение, так и запись, независимо от того, были они открыты с помощью процедуры Reset или с помощью Rewrite.

Для нетипизированных файлов в описание процедуры открытия добавляется параметр <длина записи> типа Word, который устанавливает длину записи для функций обмена с файлом. В этом

случае процедуры открытия имеют вид:

RESET ( f,<длина записи> )

REWRITE ( f,<длина записи> )

 

 

 

Для записи информации в файл из программы служит процедура

Write, синтаксис которой:

WRITE ( f,<список вывода> ),

где f - имя файловой переменной,

<список вывода> - список имен переменных.

Кроме процедуры Write для текстовых файлов имеется ее модификация - процедура Writeln:

WRITELN ( f [,<список вывода> ),

где f - имя файловой переменной типа text.

Эта процедура осуществляет те же действия, что и Write, но после операции записи производит переход к следующей строке текстового файла. Процедура в виде Writeln (f) выводит в файл f

пару символов: "возврат каретки" и "перевод строки".

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

описать в программе и размер которой не должен быть меньше размера записи, установленного при открытии файла. Заголовок процедуры имеет вид:

BLOCKWRITE ( f, <буфер>, k [,r] ),

где f - имя нетипизированного файла, в который производится запись;

<буфер> - переменная-буфер (этот параметр передается как нетипизированный);

k - число записей, записываемых за один вызов, (имеет тип Word);

r - параметр типа Word, в который помещается число фактически выведенных записей.

Содержимое переменной-буфера целиком помещается в файл f,

начиная с текущей записи.

Если при записи в файл процедурой BlockWrite на диске не окажется свободного пространства, то произойдет следующее: если параметр r в вызове процедуры BlockWrite не задан, то возникнет

ошибка ввода-вывода; если параметр r задан, то ошибка не будет зафиксирована, а после выполнения процедры его значение не будет совпадать со значением параметра k.

Для чтения данных из файла в программу служит процедура Re-

ad, синтаксис которой:

READ ( f,<список ввода> ),

где f - имя файловой переменной.

Процедура Read читает последовательность символов из файла

f, интерпретирует их как условные записи значений данных, а затем

присваивает данные с этими значениями переменным списка ввода.

Для текстовых файлов имеется модификация процедуры Read - процедура Readln:

READLN ( f [,<список ввода>] ),

где f - имя файловой переменной типа text.

Эта процедура осуществляет те же действия, что и Read, но после операции чтения производит переход к следующей строке текстового файла.

Процедура в виде Readln (f) вводит и игнорирует последовательности символов до "возврат каретки" и "перевод строки" включительно.

Для организации чтения данных из нетипизированных файловь предназначена процедура BlockRead. Заголовок данной процедуры имеет вид:

BLOCKREAD ( f, <буфер>, k [,r] ),

где то же, что и для BlockWrite

f - имя нетипизированного файла, из которого производится чтение;

<буфер> - переменая-буфер (этот параметр передается как

нетипизированный);

k - число записей, читаемых за один вызов процедуры (имеет

тип Word);

r - параметр типа Word, в который помещается число

фактически считанных записей.

Если при чтении из файла процедурой BlockRead размер буфера окажется меньше произведения <длина записи>*k, где k - число читаемых записей, то произойдет следующее: если параметр r в

BlockRead не задан, то возникнет ошибка ввода-вывода; если параметр r задан, то ошибка не будет зафиксирована, а после выполнения процедуры значение параметра r не будет совпадать со

значением параметра k.

 

6. Проверка при чтении конца файла

EOF(f)

Значение функции true, если указатель файла f указывает позицию последней компоненты f, в противном случае FALSE.

7. Удаление предварительно закрытого файла

ERASE(f)

8. Переименование предварительно закрытого файла f в файл s

RENAME(f,s)

где

VAR

f:FILE_TYP, s:STRING;

 

6.Закрытие файла

При окончании работы всей программы происходит автоматичес-

кое закрытие всех файлов, открытых в программе.

Для явного завершения действий с файлом используется проце-

дура

CLOSE ( f ),

где f - имя файловой переменной.

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

открытии файла f.

 

7. Дополнительные операции

 

а) Позиционирование, усечение, анализ состояния для типизированных и нетипизированных файлов

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

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

SEEK ( f,<номер записи> ), (поиск записи)

TRUNCATE ( f ) (отсечеение последующих записей)

и три дополнительные функции

FILESIZE ( f ),

FILEPOS ( f ),

EOF ( f ),

где f - имя файловой переменной типа, отличного от text;

<номер записи> - целое (типа longint), значение которого понимается как порядковый номер элемента файла, на который необходимо установить указатель.

Функция FileSize возвращает общее число элементов файла, а функция FilePos - номер элемента, на который установлен текущий указатель.

Функция EoF возвращает логическое значение true или false в зависимости от того, достигнут ли конец файла при чтении.

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

Процедуры Seek, FileSize, FilePos и Truncate не могут быть применимы к текстовым файлам ввиду произвольных длин строк таких файлов.

б) Процедуры анализа позиции в текстовых файлах

Некоторым подобием процедуры Seek для текстовых файлов являются функции:

SEKEOLN ( f ),

SEEKEOF ( f ).

Функция SeekEoln производит поиск конца текущей строки и возвращает соответствующее логическое значение.

Функция SeekEoF осуществляет поиск конца файла. Если в процессе поиска найден конец файла, то функция возвращает true, в противном случае - false.

в) Удаление предварительно закрытого файла

ERASE(f)

г)Переименование предварительно закрытого файла f в файл s

RENAME(f,s)

где

VAR

f:FILE_TYP, s:STRING;

 

д) Обработка ошибок

Ошибочные ситуации при работе с файлами позволяет отслеживать специальная функция, формат вызова которой:

IORESULT.

Данная функция возвращает целое число, соответствующее коду

последней ошибки в операции. Если же операция прошла без сбоев,

то функция IOresult вернет значение 0. Опросить функцию IOresult

можно только один раз после каждой операции, т.к. она обнуляет

свое значение при каждом вызове.

Коды ошибок, возвращаемые функцией IOresult, приведены в

методичке.

 

 

Пример. Организовать работу с файлом данных о городах. Хранить код города, название, число жителей и число автомобилей.

Необходимо реализовать операции добавления записей в файл, удаление, изменение и просмотр содержимого. Работу организовать в виде меню.

Задача ясна. Приступаем к проектированию.

Сколько файлов - 1.

Исходя из постановки задачи каждая запись должна состоять из четырех полей. Какой файл? Тирпизированный. Почему?

1) различные типы полей;

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

Какие поля: код (Integer), название (String(20), количество жителей (longint), количество автомобилей (longint).

Назначение Имя Тип Размер,байт
Код города (первичный ключ) Key Integer
Название Name String
Число жителей Ein LongInt
Число автомобилей Kfz LongInt

 

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

1. С новым файлом

- при запуске программы первый раз;

- при необходимости удаления всех старых данных с целью замены новыми.

2. С существующимфайлом при просмотре, удалении и изменении записей.

 

Алгоритм.

Какие процедуры:

(1) Главная программа .

Как будем реализовывать?

Если нет специальных требований, то это можно сделать различными способами.

Мы реализуем в виде спискового меню, т.е. главная программа отображает меню из пунктов: