Файлы типа Text

End.

End

While NOT Eof(F1) do begin

Begin

Reset(F1);Rewrite(F2);

F2^:=F1^;

Get(F1);Put(F2)

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

В Паскале предусмотрен предопределенный файловый тип Text. Его описание могло бы выглядеть так:

Type Text=File of Char;

Это описание в программе делать не надо, так как оно уже неявно присутствует. Поэтому вместо

Var f:File of Char;

можно написать эквивалентное описание

Var f:Text;

Для файлов типа Text определены все процедуры и функции, определенные для файлов других типов, и работают они также. Но есть важное отличие. В процедуре Read могут быть переменные разных типов, а именно, Char, Integer, Real и диапазонов на Char и Integer. В процедуре Write могут быть выражения типов Char, Integer, Real, Boolean, диапазонов на Char и Integer и строковых констант. Однако все типы, кроме типа Char и строковых констант, при выводе преобразуются во внешнее представление, то есть, в формат, предусмотренный для вывода данных на дисплей или принтер. А при вводе данные преобразуются во внутреннее представление.

То есть, эти процедуры похожи на процедуры Read и Write, предназначенные для стандартного ввода-вывода. Так же, как для стандартного ввода-вывода определены процедуры Readln и Writeln. Единственное отличие – первым фактическим параметром этих четырех процедур должна быть файловая переменная, связанная с соответствующим текстовым файлом на диске.

Так же, как в стандартном вводе-выводе, после каждого элемента вывода можно указывать формат вывода.

Так же, как в стандартном вводе-выводе, предусмотрена функция Eoln для проверки достижения конца текущей строки ввода. При вызове этой функции должен быть указан формальный параметр – файловая переменная, например, Eoln(F). Функция возвращает значение True, если операция ввода завершилась в конце строки.

Так же, как в стандартном вводе-выводе, при выводе элементы данных никак не отделяются друг от друга, поэтому программист должен предусмотреть вставку пробелов либо подходящие форматы. А при вводе элементы данных типа Char, Integer, Real и диапазонов на Char и Integer, должны быть разделены пробелами.