Для работы с текстовым файлом файловая переменная описывается стандартным описателем Text:
VAR F1,F2:Text;
Дополнительно к процедурам открытия Reset иRewrite можно использовать процедуру Append, которая позволяет записывать данные в конец существующего файла. В качестве параметров, передаваемых процедуре записи Write или Writeln, могут использоваться списки выражений, которые вычисляются перед выводом и, затем выводятся в файл F, возможно с использованием форматов вывода. В качестве параметров, передаваемых процедурам чтения Read или Readln должны быть имена простых переменных, переменных с индексом или строк. Количество параметров может быть любым, в том числе нулевым. Если в операторах отсутствует имя файла, транслятор подставляет стандартные имена Input (для ввода) и Output (для вывода). Эти файлы автоматически открываются и закрываются при завершении программы.
Текстовые файлы, из которых производится чтение числовых данных, должны содержать числовые значения, разделенные пробелами, знаками табуляции или символами конца строки. При вводе из файла данных в символьные переменные считывается по одному символу, в том числе - разделители, символ возврата каретки и символ перевода строки.
При чтении данных в строковые переменные, из файла выбирается столько символов, сколько объявлено при описании строковой переменной, однако, если достигается конец записи, строка заполняется не полностью. Переход на чтение новой записи файла (уже в другую строчную переменную!) выполнится только на новом операторе чтения, причем он должен быть Readln.
Ниже приводятся процедуры и функции, используемые при работе с текстовыми файлами, дополнительно к приведенным ранее.
Процедуры
Append(F) - открытие существующего файла для дозаписи в конец.
Flush(F) - немедленное освобождение буфера в выводной файл. Обычно физическое выполнение записи в файл осуществляется по заполнении буфера или по команде Close.
Read(F,<список ввода>) - чтение из файла начиная с текущего положения в переменные списка.
Readln(F,<список ввода>) - чтение из файла начиная с текущего положения в переменные списка. После чтения - переход на начало новой записи файла.
SetTextBuf(F,Buf,Size) - назначение в качестве буфера ввода/вывода для файла F переменной Buf (обычно какого-либо массива или строки). Если опущен необязательный параметр Size - используется вся память, занятая переменной Buf. Если процедуры нет, используется стандартный буфер длиной 128 байт.
Write(F,<список вывода>) - вывод данных в файл, начиная с текущего места в записи.
Writeln(F,<список вывода>) - вывод данных в файл, начиная с текущего места в записи. По окончании операции, переход на начало новой записи.
Функции
Eoln(F) - признак конца строки. Возвращает TRUE, если текущий указатель во входном файле достиг конца записи или конца файла, иначе возвращает значение FALSE.
SeekEof(F) - признак конца файла. Отличается от Eof(F) тем, что пропускает символы пробела и табуляции, стоящие в конце строки.
SeekEoln(F) - признак конца строки. Отличается от Eoln(F) тем, что пропускает символы пробела и табуляции, стоящие в конце строки.
Пример работы с текстовыми файлами.
Составить программу чтения вещественных чисел из текстового файла FLOAT.DAT, и запись тех из них, которые не превышают по модулю 9999, в новый текстовый файл INTEGER.DAT в табличной форме, по 10 чисел (округленных до ближайшего целого), в каждой записи. Файл с данными находится в текущем каталоге. По завершении работы файл FLOAT.DAT переименовать в REAL.DAT.
PROGRAM Example;
CONST
MAX=9999.0;
K : integer = 0; { счетчик выведенных чисел }
VAR
X :real;
Fin,Fout : text;
BEGIN
{$I- } {Отключение завершения программы по ошибке операций с файлом }
Assign(Fin,'FLOAT.DAT');
Reset(Fin); { открытие входного файла }
{$I+ } { Включение стандартного контроля ошибок операций с файлом }
if IOResult=0 then {если файл найден и открыт успешно }
Begin
Assign(Fout,'INTEGER.DAT');
Rewrite(Fout); { открытие выходного файла }
while not Eof(Fin) do { пока не достигнут конец входного файла }
Begin
Read(Fin,X);
if Abs(X)<MAX then
Begin
Write(Fout,Round(X):5);
K:=K+1;
if K mod 10 = 0 then Writeln(Fout); { переход на новую запись