Работа с файлами

Чтобы работать с файлом, при написании программы нужно сконструировать файловый тип и определить файловую переменную. В ходе работы программы файл нужно инициализировать, то есть, подготовить к использованию. В стандартном Паскале файл ввода инициализируется процедурой 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;