while not EOF( f ) do Read( f, ... );
остановится только после полного истощения файла, даже если
- 238 -
последние 1024 строк его были пустыми. Если переписать цикл в виде
while not SeekEOF( f ) do Read( f, ... );
он станет работать более эффективно.
Как и SeekEOLn, функция SeekEOF применима только к открытым для чтения текстовым файлам.
12.6.2. Операции ввода-вывода в текстовые файлы
Ввод и вывод числовой и текстовой информации в Турбо Паскале осуществляется операторами:
ввод – Read( f, X ) или Read( f, X1,X2,...,Xn ) и
ReadLn( f, X ) или ReadLn( f, X1,X2,…,Xn );
вывод – Write( f, X ) или Write( f, X1,X2,…Xn ) и
WriteLn( f, X ) или WriteLn( f, X1, X2,…,Xn ).
Если в операторе ввода-вывода первым параметром стоит логическое имя файла, то это означает, что поток данных будет приниматься (Read) или направляться (Write) на конкретное физическое устройство компьютера, связанное в данный момент с логическим именем этого файла.
Если операторы содержат один лишь список ввода-вывода, то считается, что ввод сопряжен со стандартным логическим файлом Input (под ним подразумевается клавиатура с «эхом» ввода на экране), а вывод — с логическим файлом Output (что соответствует выводу на экран дисплея).
Имена Input и Output являются предопределенными в системной библиотеке (модуле System). Напомним, что в стандартном Паскале любая программа, использующая ввод-вывод, должна начинаться со слов
PROGRAM имя( Input, Output);
что, по сути, открывает каналы ввода-вывода. В Турбо Паскале можно смело опускать описание PROGRAM и не надо описывать имена Input и Output.
Таким образом, оператор Read( x1, x2) полностью эквивалентен оператору Read( Input, x1, x2 ), а оператор Write( х3, х4) — оператору Write( Output, х3, х4 ).
12.6.2.1. Операторы Read/ReadLn. Рассмотрим сначала операторы ввода информации — Read и ReadLn. Их аргументами должен быть список переменных, значения которых будут считаны (введены). Тип переменных при вводе из текстового файла (в том числе и
- 239 -
с клавиатуры) может быть только целым, вещественным, символьным (Char), строковым или совместимым с ними. Сложные структурированные типы (такие, как массивы, множества, записи и др.) могут быть введены только по элементам (по полям для записей). Например:
| VAR
| i : Word
| l : Longint;
| r : Real;
| Rec RECORD { запись }
| x, у : Real
| ch : Char
| END;
| Dim : Array [0...99] of Byte; { массив }
| S : String;
| BEGIN
{ . . . ЧИТАЮТСЯ С КЛАВИАТУРЫ: . . . }
| Read( i, l); { два целых числа,}
| Read( l, r, s); { целое, вещественное число и строка,}
| Read( Rec.x, Rec.у, Rec.ch ); { запись по полям,}