- •Задача №1 структурированные типы данных. Файлы. Работа с типизированными файлами
- •1.1Структурированный тип данных - файловый
- •2.1Этапы работы с типизированными файлами
- •2.1.1Описание файловой переменной
- •2.1.2Связь переменной с физическим файлом
- •2.1.3 Открытие файла
- •2.1.4 Ввод/вывод в типизированный файл
- •2.1.5 Закрытие файла
- •3.1 Процедуры и функции для работы с файлами и каталогами
- •4. Задания
2.1.4 Ввод/вывод в типизированный файл
После каждой операции ввода/вывода указатель файла всегда смещается на следующий компонент файла.
-
READ(<ФП>,<СП.ВВОДА>)
– чтение из файла <ФП> компонентов <СП. ВВОДА> - переменных типа элементов типизированного файла.
-
WRITE(<ФП>,<СП.ВЫВОДА>)
– запись в файл <ФП> компонентов из <СП. ВЫВОДА> - переменных и/или констант типа элементов типизированного файла
2.1.5 Закрытие файла
-
CLOSE(<ФП>)
- закрытие файла.
После закрытие обращение к файлу для ввода/вывода невозможно – будет генерироваться ошибка, но связь файловой переменной с физическим файлом сохраняется. Есть ряд процедур, которые можно выполнить только после закрытия файла.
3.1 Процедуры и функции для работы с файлами и каталогами
ПОСЛЕ ЗАКРЫТИЯ ФАЙЛ МОЖНО:
-
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.