Лекция

Тема: «Типизированные файлы в программах на Turbo Pascal»

 

План

1. Назначение  файловых  переменных и их описание

2. Операции с файловыми переменными

3. Примеры алгоритмов по обработке файлов

 

1. Назначение файловых переменных и их описание

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

Использование переменных в данном случае не помогает, так как они описываются в оперативной памяти компьютера, которая очищается при выходе из программы или выключении электропитания.

Для решения данной проблемы нужно записывать данные на диск компьютера. В этом случае данные сохранятся и для следующей работы.

Так как данные на диске хранятся в виде файлов, то приходится использовать файловые типы данных.

Файлы принято разделять на физические и логические. Физические файлы имеют имя, и располагаются на съемном носителе, а логические это те переменные файлового типа, которые их представляют в программе.

Файлы в Паскале могут быть двух видов:

Чаще всего файлы используются для хранения значений типа «Запись», так как каждая запись содержит описание некоторого объекта и совершенно естественно желание сохранять данные о совокупности объектов на диске.

Для описания файловой переменной, состоящей из данных типа «Запись», вначале нужно описать тип «Запись», а затем описать файловый тип записей.

Type Stud = Record

FAM, IMYA, OTCH, ADRES: String [20];

GODROGD: Integer;

SRBAL, STIP: Real

End;

Fl = File Of Stud;

Var A: Fl;

В данном случае описана переменная, которая означает некоторый файл на диске, состоящий из данных о студентах группы. Такие файлы, содержащие информацию об объектах в виде записей, называют Базой данных.

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

 

2. Операции с файловыми переменными

Над файлами можно выполнить ряд операций.

Связывание файловой  переменной  с  внешним файлом

Для создания файла нужно вначале связать файловую переменную с некоторым внешним файлом, чтобы программа знала, с каким файлом нужно оперировать.

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

Assign (имя файловой переменной, имя внешнего файла);

где имя  внешнего файла указывается в кавычках и,  если файл находится не в том каталоге,  где находится программа, то указывают полное имя файла.

Например:

Assign (A, 'C:\TP7\BIN\FILE.DAT');

В этом случае переменная А связывается с внешним файлом с именем C:\TP7\BIN\FILE.DAT.

В дальнейшем любая операция над переменной А в программе автоматически выполняется над указанным файлом на диске

Создание файла

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

Rewrite (имя файловой переменной);

Данная процедура открывает новый файл и устанавливает указатель на начало файла.

Например:

 

Assign (A, 'C:\TP7\BIN\FILE.DAT');

Rewrite (A);

 

создается новый файл с именем C:\TP7\BIN\FILE.DAT

Замечание !!!

Если данной командой открыть существующий файл, то все данные в нем будут уничтожены.

Открытие файла

Для открытия файла используется процедура вида:

Reset (имя файловой переменной);

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

Процедура Reset открывает файл в режиме чтения, после чего оператором Read(<файловая переменная>, <считываемый элемент>) можно осуществить последовательное считывание элементов в программу.

Например:

Assign (A, 'C:\TP7\BIN\FILE.DAT');

Reset (A);

открывается для обработки файл с именем C:\TP7\BIN\FILE.DAT

Перемещение указателя в файле

Иногда требуется, чтобы указатель стоял на определенном элементе файла для считывания или, что еще чаще, на конце файла для добавление данных в файл.

Для установления указателя на нужную запись используют процедуру вида:

Seek (имя файловой переменной, номер позиции в файле);

Например:

Seek (A,5);

процедура устанавливает указатель в файле с именем C:\TP7\BIN\FILE.DAT на пятую запись.

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

FileSize (имя файловой переменной)

Например:

ASSIGN (A, 'C:\TP7\BIN\FILE.DAT');   

RESET (A);

SEEK (A,FILESIZE(A));

в данном примере открывается файл с именем C:\TP7\BIN\FILE.DAT и указатель в файле становится на конец.

Запись данных в файл

Для записи данных в файл используют вспомогательную переменную того же типа, что и элементы файла.

Для записи данных используют команду:

Write (имя файловой переменной, имя переменной);

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

Чтение данных из файла

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

Read (имя файловой переменной, имя переменной);

данная процедура считывает из файла в переменную элемент, на который указывает указатель и перемещает указатель на следующий элемент. Если указатель стоит на конце файла, то в этом случае используется специальная функция EOF (имя файловой переменной), которая равна True, если достигнут конец файла или False, если нет.

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

После работы с файлом его нужно закрыть.  Для этого используют команду вида:

Close (имя файловой переменной)

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

При завершении программы все открытые файлы закрываются автоматически и команду закрытия можно не использовать.

Удаление файла

При помощи процедуры Erase, можно удалить с внешнего носителя, заранее закрытый файл.

Erase(имя файловой переменной)

 

Изменение имени файла

Процедура Rеnаmе переименовывает физический файл, который перед этим следует закрыть процедурой Close.

Rеnаmе(имя файловой переменной, ‘новое имя файла’)

 

3. Переменная FileMode

Переменная FileMode,  определенная  в модуле System, задает код доступа, передаваемый в DOS для типизированных файлов (не для текстовых файлов), когда они открываются с помощью процедуры Reset.

По умолчанию значение  FileMode = 2. 

При этом допускается чтение и запись файла. Присваивание FileMode другого значения приводит к использованию этого режима при всех последующих вызовах Reset.

Примечание: Новые файлы, открываемые с помощью Rewrite, всегда открываются в режиме чтения/записи, что соответствует Filemode = 2.

 

Диапазон допустимых значений FileMode зависит от используемой версии DOS. Однако, во всех версиях определены следующие режимы:

             0:  доступ только по чтению

             1:  Только запись

             2:  Чтение/запись

 

4. Примеры алгоритмов по обработке файлов

Так как запись в файл и чтение из файла происходит поэлементно, то при работе с файлами чаще всего приходится использовать циклы.

Пример. Создать файл для хранения информации о группе студентов  и записать в него данные

 

{Подключаем модуль по работе с экраном}

Uses Crt;

{Описываем пользовательский тип «запись»}

Type Stud = Record

FAM, IMYA, OTCH, ADRES: String [20];

GODROGD: Integer;

SRBAL, STIP: Real

End;

{Описываем тип «файл записей»}

Fl = File Of Stud;

{Описываем переменные}

Var A: Fl;

I, N: Integer;

B: Stud;

Begin

{Связываем файловую переменную с внешним файлом на диске}

Assign (A,'C:\TP7\BIN\FILE.DAT');

{Создаем файл}

Rewrite (A);

{Вводим количество добавляемых записей}

Write ('Введите количество студентов в группе: ');

Readln (N);

For I:=1 To N Do

Begin

Writeln ('Введите данные об ',i,'-м студенте:');

{Вводим данные о студенте}

With B Do

Begin

Write ('фамилия - ');Readln (FAM);

Write ('имя - '); Readln (IMYA);

Write ('отчество - '); Readln (OTCH);

Write ('год рождения - '); Readln (GODROGD);

Write ('адрес - '); Readln (ADRES);

Write ('средний бал - '); Readln (SRBAL)

End;

{Записываем введенную запись в файл}

Write (A,B)

End;

End.

 

Пример. Открыть файл и добавление в него информацию

 

{Подключаем модуль по работе с экраном}

Uses Crt;

{Описываем пользовательский тип «запись»}

Type Stud = Record

FAM, IMYA, OTCH, ADRES: String [20];

GODROGD: Integer;

SRBAL, STIP: Real

End;

{Описываем тип «файл записей»}

Fl = File Of Stud;

{Описываем переменные}

Var A: Fl;

I, N: Integer;

B: Stud;

Begin

{Связываем файловую переменную с внешним файлом на диске}

Assign (A,'C:\TP7\BIN\FILE.DAT');

{Открываем файл для обработки}

Reset (A);

{Ставим указатель в файле на конец}

Seek (A, FileSize(A));

{Вводим количество добавляемых записей}

Write ('Введите количество студентов в группе: ');

Readln (N);

For I:=1 To N Do

Begin

Writeln ('Введите данные об ',i,'-м студенте:');

{Вводим данные о студенте}

With B Do

Begin

Write ('фамилия - ');Readln (FAM);

Write ('имя - '); Readln (IMYA);

Write ('отчество - '); Readln (OTCH);

Write ('год рождения - '); Readln (GODROGD);

Write ('адрес - '); Readln (ADRES);

Write ('средний бал - '); Readln (SRBAL)

End;

{Записываем введенную запись в файл}

Write (A,B)

End;

End.

 

Пример. Написать программу, которая удаляет из файла студентов с фамилией на заданные буквы.

 

{Подключаем модуль по работе с экраном}

Uses Crt;

{Описываем пользовательский тип «запись»}

Type Stud = Record

FAM, IMYA, OTCH, ADRES: String [20];

GODROGD: Integer;

SRBAL, STIP: Real

End;

{Описываем тип «файл записей»}

F = File Of Stud;

 

{Описываем переменные}

Var A1, A2: Fl;

 I: Integer;

 B: Stud;

 F: String[20];

 

Begin

{Связываем файловую переменную с внешним файлом на диске}

Assign (A1,'C:\TP7\BIN\FILE.DAT');

{Связываем файловую переменную с внешним буферным файлом на диске}

Assign (A2,'C:\TP7\BIN\BUFER.DAT');

 

{Открываем файл для обработки}

Reset (A1);

Rewrite(A2);

 

{Вводим фамилию для удаления}

Write('Введите фамилию для удаления: '); readln(F);
 

{Организовываем цикл по всем записям файла}

{Если фамилия студента не совпадает с введенной, }

{то переписываем студента в буферный файл}

 

For I:=1 To FileSize (A) Do

Begin

    {Читаем данные из файла в переменную В}

    Read (A1, B);

    If Copy(B.Fam,1,Length(F))=F Then

            A2.Write(B);

End;

 

{Закрываем файлы}

Close(A1);

Close(A2);

 

{Удаляем исходный файл}

Erase('FILE.DAT');

 

{Переименовываем буферный файл в исходный}

Rename('BUFER.DAT', 'FILE.DAT');

 

{Выводим сообщение}

Writeln ('Данные успешно удалены...');

Readln;

End.