Текстовые файлы трактуются в Турбо Паскале как совокупность строк переменной длины. К каждой строке возможен лишь последовательный доступ, начиная с первой строки. В конце каждой строки ставится специальный признак (маркер) eol (end of line), а в конце файла - признак (маркер) eof (end of file).
При формировании текстового файла с клавиатуры признак eol генерируется при нажатии клавиши Enter, признак eof - при нажатии клавиш Ctrl+Z. Признак eol - это два последовательных байта с кодами по таблице ASCII #13 и #10. Признак eof - байт с кодом #26. Код #13 обычно обозначают CR (Carrige return - Возврат каретки), код #10 - LF (Line feed - Перевод строки), код #26 - Sub (Замена).
Для выполнения операций ввода-вывода в текстовых файлах используются процедуры Read, Readln, Write, Writeln.
Процедура Readln(F) производит поиск в файле F ближайшего маркера eol и устанавливает указатель файла на следующую после eol позицию, т.е. при этом производится переход на следующую строку текстового файла..
Процедура Writeln(F) записывает в текущую позицию файла F маркер eol.
Если из текстового файла читаются переменные типа char, то в этом случае читается все содержимое файла, в том числе коды #13, #10, #26 и др. Ввод переменных типа stringосуществляется по текущей длине строк файла, если она не превышает объявленную длину строковой переменной; в противном случае читается количество символов, соответствующее длине этой переменной. В общем случае при вводе строк целесообразно использовать процедуру Readln, при вводе чисел - процедуру Read.
При вводе очередного числа процедура Read вначале производит его выделение из строки файла, а затем преобразование в числовой формат аналогично тому, как это делает процедура Val.
Для текстовых файлов могут использоваться три предописанные функции, неприменимые для файлов другого типа: Eoln, SeekEoln и SeekEof.
Функция Eoln(F):boolean возвращает значение true, если во входном потоке достигнут маркер конца строки eol.
Функция SeekEoln(F):boolean пропускает все пробелы и знаки табуляции до маркера конца строки eol или до первого значащего символа и возвращает значение true, если такой маркер обнаружен.
Функция SeekEof(F):boolean пропускает все пробелы, знаки табуляции и маркеры конца строки вплоть до маркера конца файла eof или до первого значащего символа и возвращает значение true, если такой маркер обнаружен.
Ввод из текстового файла рекомендуется организовывать с использованием функций Eof или SeekEof.
Пример. Ввести из текстового файла числовой массив, количество элементов которого заранее неизвестно.
Program InNum1;
ConstNmax = 1000;
TypeAr = array[1..Nmax] of real;
Varn : integer; { кол-во элементов в массиве }
X : Ar;
F : text;
Begin
Assign(F,'F.dat'); Reset(F);
n:=0;
While not eof(F) do
Begin
Inc(n); Read(F,X[n]);
End;
Close(F);
End.
Программа InNum1, используемая для ввода числовых данных, имеет один недостаток. Если в файле между последним числом и маркером eof имеется хотя бы один пробел, то это вызовет ввод и соответственно включение в массив X дополнительного элемента, равного нулю, что может в дальнейшем исказить результаты обработки массива X. Этот недостаток можно устранить, если при вводе числовых данных вместо функции Eof использовать функцию SeekEof. Тогда соответствующий фрагмент программы InNum1 будет иметь вид:
While notSeekEof(F) do
Begin
Inc(n); Read(F,X[n]);
End;
При вводе последовательности строк нужно использовать функцию Eof, поскольку функция SeekEof игнорирует пробелы в файле, несмотря на то, что эти пробелы могут входить в состав вводимых строк.
Если при вводе строк вместо процедуры Readln использовать процедуру Read, то после исчерпания строки файла будет непрерывно читаться пустая строка, следствием чего является зацикливание программы: