Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pascal_lectures_small.doc
Скачиваний:
13
Добавлен:
23.03.2015
Размер:
339.46 Кб
Скачать
      1. Работа с файлами

Чтобы работать с файлом, при написании программы нужно сконструировать файловый тип и определить файловую переменную. В ходе работы программы файл нужно инициализировать, то есть, подготовить к использованию. В стандартном Паскале файл ввода инициализируется процедурой Reset, а файл вывода – процедурой Rewrite. Пусть F1 и F2 – файловые переменные.

Reset(F1);{открывается файл для ввода}

Rewrite(F2);{открывается файл для вывода}

В стандартном Паскале не рассматривается вопрос связывания файловой переменной с реальным файлом на внешнем носителе. Паскаль возник во время господства пакетных операционных систем, в которых связывание файловых переменных с файлами производилось не в программе на Паскале, а в специальном задании операционной системы на пакетную обработку. В интерактивных операционных системах связывание файла с файловой переменной производится либо специальными процедурами (например, в Turbo Pascal, с помощью специальной процедуры Assign) либо путем расширения синтаксиса процедур Reset и Rewrite.

Рассмотрим элементарные операции ввода и вывода, то есть, операции, обеспечивающие обмен одним элементом данных за одну операцию. Пусть F1 и F2 – файловые переменные, причем, F1 связана с файлом ввода, а F2 – с файлом вывода.

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

InData:=F1^;{доступ к элементу данных с использованием файловой переменной, как указателя}

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

Далее элементарные операции ввода и вывода выполняются процедурами Get и Put.

Ввод:

Get(F1);{переход к следующему элементу данных в файле и чтение его в ячейку, на которую указывает файловая переменная}

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

InData:=F1^;

Вывод:

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

F2^:=OutData;

После этого можно выполнять процедуру

Put(F2);{запись элемента данных в файл, добавление к файлу новой пустой позиции и переход на нее}

При работе с файлом ввода обычно не известно, сколько позиций он содержит. Если после выполнения процедуры Get указатель текущей позиции установился после последней позиции файла, значение, которое можно прочитать через файловую переменную, становится неопределенным. Попытка выполнить процедуру Get еще один раз будет воспринята операционной системой как ошибка. Чтобы избежать этого, предусмотрена функция Eof, проверяющая достижение конца файла.

Eof(F1);

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

Пример: программа, копирующая побайтно файл, связанный с переменной F1, в файл, связанный с переменной F2. Независимо от того, какую на самом деле информацию содержит исходный файл, оба файла открываются с однобайтным базовым типом Char, что обеспечивает получение точной копии исходного файла.

Program FileCopy(F1,F2);

Var F1,F2: file of Char;

Begin

Reset(F1);Rewrite(F2);

While NOT Eof(F1) do begin

F2^:=F1^;

Get(F1);Put(F2)

end

End.

Для большего удобства работы с файлами в Паскале предусмотрены процедура ввода Read и процедура вывода Write.

<процедура ввода> ::="Read" "("<файловая переменная> "," <переменная> {"," <переменная>} ")".

<процедура вывода> ::="Write" "("<файловая переменная> "," <выражение> {"," <выражение>} ")".

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

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

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

Пусть нужно ввести данные из файла, связанного с файловой переменной F1 в 3 переменных: A, B и C. Используя элементарные операции, это можно сделать следующим образом:

Reset(F1);

A:=F1^; Get(F1);

B:=F1^; Get(F1);

C:=F1^; Get(F1);

Используя процедуру Read те же действия можно выполнить следующим образом:

Reset(F1);

Read(F1,A,B,C);

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

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

Close(F2);

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

В некоторых реализациях, например, в Turbo Pascal, процедуры элементарного ввода-вывода Put и Get отсутствуют.

Следует учитывать, что при выводе данных в файлы и при вводе из файлов информация никаким образом не преобразуется – обмен данными производится во внутреннем представлении компьютера. Также в записанном файле не хранится информация о его типе. Если был записан файл с базовым типом Real, его можно прочитать как файл с базовым типом Integer, однако данные при этом будут совершенно искажены, так как внутреннее представление различно для разных типов данных. Обеспечение соответствия вводимых данных сохраненным данным возлагается на программиста.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]