Файлы типа 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, должны быть разделены пробелами.