
- •Алгоритмические языки и программирование работа с файлами
- •Брянск 2007
- •1. Цель работы
- •2. Теоретическая часть
- •2.1. Типизированные файлы
- •2.1.1. Объявление файловой переменной
- •2.1.2. Связывание файловой переменной
- •2.1.3. Открытие файла
- •2.1.4. Операции ввода/вывода
- •2.1.5. Дополнительные операции (применяемые только
- •2.1.6. Закрытие файла
- •2.2. Текстовые файлы
- •2.3. Нетипизированные файлы
- •2.4. Дополнительные подпрограммы для работы с файлами
- •2.4.1. Переименование и удаление
- •2.4.2. Обработка ошибок ввода/вывода
- •2.4.3. Операции с каталогами
- •2.4.4. Дополнительные операции
- •2.5. Примеры
- •2.5.1. Работа с типизированными файлами
- •2.5.2. Работа с текстовыми файлами
- •2.5.3. Работа с нетипизированными файлами
- •3. Порядок выполнения работы
- •4. Список заданий
- •4.1. Работа с типизированными файлами
- •4.2. Работа с текстовыми файлами
- •5. Контрольные вопросы
- •6. Список рекомендуемой литературы
2.1.4. Операции ввода/вывода
После открытия файла ввод и вывод записей осуществляется с помощью обращения к процедурам:
Read(имя_файловой_переменной, имя_переменной);
и
Write(имя_файловой_переменной, имя_переменной);
Процедура Read читает в переменную текущую запись файла, автоматически перемещая указатель на следующую запись.
Процедура Write выводит содержимое переменной в текущую запись файла, также перемещая указатель на следующую запись.
Например:
Read(FI, Kart1); {Чтение текущей записи из файла FI в переменную Kart1}
Write(FR, Kart2); {Вывод содержимого переменной Kart2 в текущую запись файла FR}
Таким образом, с помощью процедур Read и Write можно последовательно прочитать все записи файла и заполнить файл, т.е. эти процедуры позволяют осуществить последовательный доступ к типизированным файлам.
Количество элементов файла в конкретный момент времени может быть неизвестно. Для правильной работы с файлом в этом случае перед каждым выполнением операции вывода необходимо проверять достижение конца файла.
Структура файла такова, что в конце файла располагается специальный символ EOF. Существует функция, позволяющая осуществлять контроль достижения конца файла:
EOF(имя_файловой_переменной);
Она возвращает значение true (истина), если при чтении достигнут конец файла (указатель находится за последним компонентом), и значение false (ложь), когда указатель находится на другом компоненте.
Эта функция наиболее часто используется в цикле чтения записей до конца файла.
Например:
{Пока не найден конец файла FI}
While not(EOF(FI)) Do Begin
Read(FI, Karta1); {Читать запись из FI в Karta1}
End;
2.1.5. Дополнительные операции (применяемые только
при работе с типизированными файлами)
Переместить указатель (позиционировать) на запись с определённым номером можно с помощью специальной процедуры:
Seek(имя_файловой_переменной, номер_позиции);
где номер_позиции – константа, переменная или выражение целого типа, содержащее номер позиции, которую необходимо сделать текущей. Номер позиции должен находиться в допустимых пределах (от 0 до n-1, если файл содержит n записей).
Например:
Seek(FI, 0); {Установка указателя файла на нулевую запись файла FI}
Seek(FR, 10); {Установка указателя файла на последнюю запись в файле, состоящем из 10 записей}
Таким образом, процедура Seek, позволяя сделать текущей любую запись, реализует прямой метод доступа в типизированных файлах.
С процедурой Seek связана и процедура Truncate, позволяющая удалить из файла все записи, начиная с текущей и заканчивая последней, т.е. Truncate позволяет «отсечь конец» открытого файла
Truncate(имя_файловой_переменной);
Например, для того чтобы из файла удалить все записи, начиная с пятой, необходимо сделать текущей шестую запись (она имеет номер 5), а затем обратиться к процедуре Truncate:
{Установка указателя на 6-ю позицию}
Seek(FI, 5);
Truncate(FI); {Удаление всех записей, начиная с текущей}
Целочисленная функция FileSize(имя_файловой_переменной) возвращает число, равное реальному количеству записей в файле (оно на единицу больше номера последней записи).
Например:
WriteLn('Файл содержит ', FileSize(FI):4, ' записей.');
При добавлении новой записи в конец файла необходимо установить указатель за последний компонент (на маркер «конец файла») следующим образом:
Seek(FI, FileSize(FI));
Вызов процедуры Seek(FI, FileSize(FI)-1); позволяет осуществить доступ к последней записи файла.
Функция целого типа FilePos(имя_файловой_переменной) возвращает номер текущей записи файла в диапазоне от нуля до n-1, где n – количество компонентов, записанных в файле. Номер реальной записи всегда на единицу больше значения, возвращаемого FilePos, и лишь когда текущей записью является маркер «конец файла», эта функция возвращает число, равное реальному количеству компонентов в файле (то же, что и FileSize).
Например:
WriteLn('Номер текущей записи:', FilePos(FI)+1);
If FilePos(FI)=FileSize(FI) then
WriteLn('Обнаружен конец файла');