Текстовый файл (описатель text в отличие от типизированного файла file of char) представляет собой файл символов, сгруппированных в строки. Разбиение на строки обеспечивается признаком (комбинаций символов) конца строки. Для текстовых файлов существует специальный вид операций чтения и записи (read, write, readln, writeln), который позволяют считывать и записывать значения, тип которых отличается от символьного типа (это действительные, целочисленные типы и строки, выводить можно также и данные булевского типа). Такие значения автоматически переводятся в символьное представление и обратно. Например, Read(f,i), где i - переменная целого типа, приведет к считыванию последовательности цифр, интерпретации этой последовательности как десятичного числа, и сохранению его в i. Предопределены две стандартные переменные типа text – это Input и Оutput. Стандартная файловая переменная Input – это доступный только для чтения файл, связанный со стандартным файлом ввода операционной системы (обычно это клавиатура), а стандартная файловая переменная Оutput – это доступный только для записи файл, связанный со стандартным файлом вывода операционной системы (обычно это дисплей). Перед началом выполнения программы файлы Input и Оutput автоматически открываются, как если бы были выполнены следующие операторы:
Assign(Input,'con'); Reset(Input);
Assign(Output,'con'); Rewrite(Output);
После завершения работы программы эти файлы автоматически закрываются.
Обращение к процедурам ввода и вывода для текстовых файлов организуется так:
Read(f,<список элементов ввода>),
write(f,<список элементов вывода>),
readln(f,<список элементов ввода>),
writeln(f,<список элементов вывода>)
f – имя файловой переменной. Список элементов ввода представляет собой список имен переменных символьного, целочисленного, действительного или строкового типа через запятую. Данные в строке читаемого текстового файла трактуются как символьное представление данных соответствующего типа.
· Данные целого типа читаются с текущего символа, пропуская лидирующие пробелы, до первого символа, синтаксически не совместимого с представлением целого числа, либо до конца строки файла.
· Переменная типа CHAR принимает значение текущего символа.
· Переменная-строка принимает символы, пока не будет достигнута ее максимальная длина, либо конец строки файла.
· Данные вещественного типа читаются последовательно из строки файла, пока не будет достигнут символ, синтаксически не совместимый с представлением вещественного числа, либо конец строки файла.
I =36, J = 24, CH = ' ', S = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
При завершении операции ввода данных во все переменные списка элементов ввода процедура readln осуществляет переход на новую строку текстового файла. В ТР, начиная с седьмой версии, при достижении конца строки чтение данных из текстового файла продолжается со следующей строки, если список ввода не исчерпан. Однако, с целью сохранения мобильности и читабельности программы, не следует пользоваться этим при проектировании ввода данных. Рекомендуется осуществлять переход на другую строку явным образом. Вот два примера:
program ReadEoln {Плохое решение};
var c:char; f:text;
begin
assign(f,'text.txt');
reset(f); {Нужно использовать шаблон безопасного открытия}
while not(eof(f)) do
begin
read(f,c);
write(c);
end;
close(f);
writeln;
readln;
end.
program Copy {хорошее решение, шаблон!};
var c:char; f:text;
begin
assign(f,'text.txt');
reset(f){Нужно использовать шаблон безопасного открытия};
while not(eof(f)) do
begin while not(eoln(f)) do
begin
read(f,c);
write(c);
end;
readln(f);
writeln;
end;
close(f);
writeln;
readln;
end.
Список элементов вывода представляет собой список выражений (в частности, переменных и констант) символьного, строкового, целочисленного действительного и булевского типа. После каждого выражения может указываться через двоеточие характеристика длины, а для выражений действительного типа еще и характеристика точности. При завершении операции вывода данных процедура writeln осуществляет переход на новую строку текстового файла.
Вот два примера работы с текстовыми файлами (предложены Путинцевым А).
{Добавление записей в файл данных о дневной температуре воздуха}
program aprec;
var
DayTemp:record {дневная темперарура}
day:integer; {число}
month:integer; {месяц}
temper:integer; {температура}
end;
f:text;{ файл дневной температуры}
begin
assign(f,'a:\temperat.txt');
append(f); {открываем файл для добавления записи}
{Нужно использовать шаблон безопасного открытия}
write('Введите в одной строке, разделяя пробелами');
writeln(' число, номер месяца и температуру');
write('->');
with DayTemp do
begin
readln(day,month,temper);
writeln(f,day,' ',month,' ',temper);
{Следовало бы указать характеристики длины}
end;
close(f);
writeln('Данные добавлены');
end.
{Чтение записей из файла}
program readrec;
var
DayTemp:record {дневная температура}
day:integer; {число}
month:integer; {месяц}
temper:integer; {температура}
end;
f:text; {файл дневной температуры}
mes:integer;{номер месяца}
n:integer;{кол-во дней месяца, о которых есть данные в файле}