Процедуры и функции для работы с файлами и каталогами
ЗАДАЧА №1
СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ. ФАЙЛЫ. РАБОТА С ТИПИЗИРОВАННЫМИ ФАЙЛАМИ
СТРУКТУРИРОВАННЫЙ ТИП ДАННЫХ - ФАЙЛОВЫЙ
ФАЙЛ
- именованная область внешней памяти или логическое устройство – потенциальный источник или приемник информации (с точки зрения программы).
- набор однотипных элементов, длина которого ограничивается только объемом внешней памяти (с точки зрения структурированного типа данных).
ВИДЫ ФАЙЛОВЫХ ПЕРЕМЕННЫХ И ИХ ОПИСАНИЕ:
Ø ТИПИЗИРОВАННЫЕ ФАЙЛЫ
- компоненты фиксированной длины указанного при описании типа, что позволяет осуществить прямой доступ к компонентам. Описание:
VAR <ИМЯ1>: FILE OF <ТИП>; |
Где <ТИП> - любой тип – тип элементов файла.
Ø ТЕКСТОВЫЕ ФАЙЛЫ
- компоненты – строки переменной длины, доступ только последовательный. Описание:
VAR <ИМЯ2>: TEXT; |
Ø НЕТИПИЗИРОВАННЫЕ ФАЙЛЫ
- компоненты – двоичные блоки фиксированной емкости, информация из которых не интерпретируется, возможен прямой доступ. Описание:
VAR <ИМЯ3>: FILE; |
ПРИМЕРЫ ОПИСАНИЙ ФАЙЛОВЫХ ТИПОВ И ПЕРЕМЕННЫХ
TYPE F1=TEXT; F2=FILE OF INTEGER; {файловый тип данных, состоящий из целочисленных элементов типа INTEGER} F3=FILE; VAR A0:F1; A1: TEXT; {два текстовых файла} A2:F2; {файл из целых чисел типа INTEGER} A3:F3; {двоичный файл} |
ЭТАПЫ РАБОТЫ С ТИПИЗИРОВАННЫМИ ФАЙЛАМИ
Ø Описание файловой переменной
Ø Связь переменной с физическим файлом
Ø Инициализация (открытие) файла
Ø Ввод/вывод в файл
Ø Закрытие файла
Описание файловой переменной
При описании переменной для типизированного файла обязательно указывается тип элементов.
TYPE FINT=FILE OF INTEGER; {файловый тип данных, состоящий из целочисленных элементов типа INTEGER } VAR F1: FILE OF REAL; {файл из вещественных чисел типа REAL} F2:FINT; {файл из целых чисел типа INTEGER} |
Связь переменной с физическим файлом
Ø ASSIGN (<ПЕРЕМЕННАЯ>,<ФАЙЛ>)
- связывает файловую переменную <ПЕРЕМЕННАЯ> с файлом, имя которого находится в строковой переменной или константе <ФАЙЛ>. Связь сохраняется до следующего оператора assign для данной переменной или до конца программной единицы, в которой определена указанная переменная.
ПРИМЕРЫ
ASSIGN(F1,’FFF.DAT’); ASSIGN(F2,’INT.DAT’); |
Открытие файла
REWRITE(<ФП>)
- открытие файла на запись, причем указатель помещается в начало файла (на нулевой элемент). Если файл существует, то его содержимое уничтожается. Если файл не существует, то он создается.
RESET(<ФП>)
-открытие файла на чтение/запись, причем указатель помещается в начало файла (на нулевой элемент). Если файл не существует, генерируется ошибка ввода/вывода.
КОРРЕКТНОЕ ОТКРЫТИЕ ФАЙЛА
{$I-}{отключить контроль ошибок ввода/вывода – директива компилятора} RESET(A2); {открыть файл на чтение} {$I+}{включить контроль ошибок ввода/вывода – директива компилятора} IF IORESULT<>0 THEN {проверить функцию ошибки} … {действия в случае ошибки – отсутствия файла на диске} ELSE … {действия в случае успешного открытия файла} |
2.1.4 Ввод/вывод в типизированный файл
После каждой операции ввода/вывода указатель файла всегда смещается на следующий компонент файла.
Ø READ(<ФП>,<СП.ВВОДА>)
– чтение из файла <ФП> компонентов <СП. ВВОДА>- переменных типа элементов типизированного файла.
Ø WRITE(<ФП>,<СП.ВЫВОДА>)
– запись в файл <ФП> компонентов из <СП. ВЫВОДА> - переменных и/или констант типа элементов типизированного файла
Закрытие файла
Ø CLOSE(<ФП>)
- закрытие файла.
После закрытие обращение к файлу для ввода/вывода невозможно – будет генерироваться ошибка, но связь файловой переменной с физическим файлом сохраняется. Есть ряд процедур, которые можно выполнить только после закрытия файла.
ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ФАЙЛАМИ И КАТАЛОГАМИ
ПОСЛЕ ЗАКРЫТИЯ ФАЙЛ МОЖНО:
Ø ERASE(<ФП>)
– удалить файл.
Ø RENAME(<ФП>,<НОВОЕ ИМЯ>)
– переименовать файл.
ПОЛЕЗНЫЕ ПОДПРОГРАММЫ ДЛЯ ОБРАБОТКИ ФАЙЛОВ
Ø IORESULT
– функция типа WORD; возвращает условный признак последней операции ввода-вывода, если успешно, то 0.
Ø EOF(<ФП>)
– функция типа BOOLEAN; возвращает true, если указатель файла находится в его конце, иначе – false.
Ø FLUSH(<ФП>)
– очищает буфер, связанный с файлом, гарантируя сохранность всех последних изменений
ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С КАТАЛОГАМИ
Ø CHDIR(<ПУТЬ>)
– сменить текущий каталог
Ø MKDIR(<ПУТЬ>)
– создать новый каталог
Ø RMDIR(<ПУТЬ>)
– удалить пустой каталог
Ø GETDIR(<УСТРОЙСТВО>,<ПУТЬ>)
– получить имя текущего каталога и номер устройства, на котором он находится
Библиотека DOS.TPU содержит еще ряд полезных процедур и функций работы с дисками, логическими устройствами, файлами и т.п.
ПОЛЕЗНЫЕ ФУНКЦИИ ДЛЯ ОРГАНИЗАЦИИ ПРЯМОГО ДОСТУПА К КОМПОНЕНТАМ ТИПИЗИРОВАННОГО ФАЙЛА
Так как длина каждого компонента типизированного файла фиксирована, то можно осуществить прямой доступ к нему, указав порядковый номер (нумерация компонентов начинается с 0)
Ø SEEK (<ФП>,<N>)
– процедура устанавливает указатель файла на компонент с номером N.
Ø FILEPOS(<ФП>)
– функция типа longint; возвращает номер следующего считываемого компонента (т.е. того, на котором сейчас находится указатель файла).
Ø FILESIZE(<ФП>)
– функция типа longint; возвращает количество записей в файле.
Ø TRUNCATE(<ФП>)
– процедура «усекает» длину файла до текущей записи (положения указателя).
ПРОЦЕДУРА СОЗДАНИЯ ФАЙЛА ИЗ ЦЕЛЫХ ЧИСЕЛ
PROCEDURE CREATE(NAME:STRING); VAR F:FILE OF INTEGER; {файловая переменная} X:INTEGER; BEGIN ASSIGN (F,NAME); {файловая переменная связана с файлом с именем NAME} {$I-} REWRITE(F); {открыть файл на запись (перезапись)} {$I+} IF IORESULT=0 THEN {если файл открыт} BEGIN WRITELN(‘VVEDITE CHISLA (OSTANOVKA 0):’); READ(X); WHILE X<>0 DO{вводим числа в цикле до нулевого значения и записываем их в файл} BEGIN WRITE (F,X); READ(X); END; CLOSE(F); {закрыть файл} END; END; |
ПРОЦЕДУРА РАСПЕЧАТКИ СОДЕРЖИМОГО ФАЙЛА ИЗ ЦЕЛЫХ ЧИСЕЛ
PROCEDURE PRINT(NAME:STRING); VAR F:FILE OF INTEGER; {файловая переменная} X:INTEGER; BEGIN ASSIGN (F,NAME); {файловая переменная связана с файлом с именем NAME} {$I-} RESET(F); {открыть файл на чтение} {$I+} IF IORESULT=0 THEN {если файл открыт} BEGIN WHILE NOT(EOF(F)) DO {пока не достигнут конец файла } BEGIN{читаем элемент из файла и выводим ее на консоль} READ(F,X); WRITE(X:6); END; WRITELN; CLOSE(F); {закрыть файл} END; END; |
ПРОЦЕДУРА УДАЛЕНИЯ ИЗ ФАЙЛА ВСЕХ ОТРИЦАТЕЛЬНЫХ ЧИСЕЛ
PROCEDURE SGAT(NAME:STRING); VAR F:FILE OF INTEGER; {файловая переменная} X,K,S:INTEGER; BEGIN S:=0; {обнуляем счетчик отрицательных чисел} ASSIGN (F,NAME);{файловая переменная связана с файлом с именем NAME} {$I-} RESET(F); {открыть файл на чтение/запись} {$I+} IF IORESULT=0 THEN {если файл открыт} BEGIN WHILE NOT(EOF(F)) DO {пока не достигнут конец файла} BEGIN READ(F,X); {читаем целое число из файла} IF X=0 THEN {если прочитанный элемент – отрицательный считаем его} S:=S+1 ELSE BEGIN K:=FILEPOS(F); {иначе запоминаем в k позицию, следующую за прочитанным положительным элементом} SEEK(F,K-1-S); {смещаем указатель на позицию за последней положительной записью} WRITE(F,X); {записываем считанный элемент} SEEK(F,K); { и переходим к еще непрочитанной позиции} END; END; SEEK(F,FILEPOS(F)-S); {смещаем указатель на длину файла — количество удаленных элементов} TRUNCATE(F); { и «обрезаем» лишнее} CLOSE(F); {закрываем файл, чтобы сохранить изменения в файле} END; END; |
ПРИМЕР ПРОГРАММЫ, ИСПОЛЬЗУЮЩЕЙ ПРИВЕДЕННЫЕ ВЫШЕ ПОДПРОГРАММЫ
BEGIN CREATE(‘FILE1.TXT’); {создать файл} PRINT(‘FILE1.TXT’); {распечатать файл} SGAT(‘FILE1.TXT’); {сжать файл} PRINT('FILE1.TXT'); {распечатать измененный файл} READLN; END. |
ЗАДАНИЯ
Программа должна быть разбита на несколько подпрограмм-процедур и подпрограмм-функций и обязательно содержать:
1. Процедуру формирования исходного файла;
2. Процедуру вывода результата работы программы;
3. Одну или более процедур (функций), реализующих вычислительную часть алгоритма.
Все подпрограммы-процедуры и подпрограммы-функции должны содержать список параметров, причем файл должен передаваться как параметр процедуры (функции). Основная программа должна содержать только операторы вызова подпрограмм.
ВАРИАНТЫ
№ | Постановка задачи |
Дан файл f, компоненты которого являются действительными числами. Найти: Сумму компонент файла f. Записать эту сумму в конец файла. Отсортировать файл по возрастанию значений компонент. | |
Дан файл f, компоненты которого являются действительными числами. Найти: Произведение компонент файла f. Записать это произведение после компоненты с номером N. Отсортировать файл, начиная с компоненты с номером N по убыванию. | |
Дан файл f, компоненты которого являются действительными числами. Найти: Сумму квадратов компонент файла f. Записать эту сумму в конец файла. Отсортировать файл по возрастанию. | |
Дан файл f, компоненты которого являются действительными числами (положительные и отрицательные). Найти: Модуль суммы и квадрат произведения компонент файла f. Записать эти значения в конец файла. Отсортировать файл по возрастанию. | |
Дан файл f, компоненты которого являются действительными числами X1,X2,…Xn, образованными по закону: Xi=(i-0.1)/(sqr(i)*i+abs(tg2*i)) (i=1,2,…N). Дано действительное число e>0. Записать в файл h те элементы файла f, для которых выполняется условие: abs(Xi)<e | |
Дан файл f, компоненты которого являются действительными числами. Найти: Наибольшее из значений компонент файла. Записать это значение N раз после наименьшего значения компоненты файла (Можно использовать вспомогательный файл). | |
Дан файл f, компоненты которого являются действительными числами. Найти: Наименьшее из значений компонент файла с четными номерами. Записать это значение N раз в конец файла | |
Дан файл f, компоненты которого являются действительными числами (положительные и отрицательные). Найти: Наибольшее из значений модулей компонент файла с нечетными номерами. Записать это значение после компоненты файла с номером N | |
Дан файл f, компоненты которого являются действительными числами. Найти: Сумму наибольшего и наименьшего из значений компонент. Создать новый файл g, в котором эта сумма является первой компонентой, остальные компоненты переписать из файла f Упорядочить компоненты файла g по убыванию | |
Дан файл f, компоненты которого являются действительными числами. Создать файл g по следующему правилу: каждая компонента файла g равна разности между наибольшей компонентой файла f и компонентой файла f с номером i (i=1,2,…). Упорядочить компоненты файла g по возрастанию | |
Дан файл f, компоненты которого являются целыми числами. Найти: количество четных чисел среди компонент с нечетными номерами. Добавить это значение в конец файла. | |
Дан файл f, компоненты которого являются целыми числами. Найти: Количество удвоенных нечетных чисел среди компонент файла. Записать это значение в начало файла. | |
Дан файл f, компоненты которого являются целыми числами. Найти количество квадратов нечетных чисел среди компонент файла. Записать это значение в начало нового файла g. Остальные значения переписать из исходного файла f. |