12.6.1.6. Функция SeekEOF( VAR : Text) : Boolean. Эта функция замыкает ряд функций, начатый EOLn и SeekEOLn. Если отнять у SeekEOLn способность реагировать на признак конца строки, то получится функция SeekEOF, которая возвращает True, если только следующий за текущим положением символ — конец файла (#26), или если перед концом файла имеются только пробелы и (или) символы табуляции (#9), и (или) признаки конца строки (#13). Короче говоря, символы #9, #13, #32(пробел) для SeekEOF являются «прозрачными», и если сквозь них «виден» конец файла #26, то функция возвращает значение True. Во всех прочих случаях вернется значение False.

Функция позволяет найти смысловой конец файла, а не физический. Это полезно при работе с числами (реже с символами). Так, цикл чтения из файла f

while not EOF( f ) do Read( f, ... );

остановится только после полного истощения файла, даже если

- 238 -

последние 1024 строк его были пустыми. Если переписать цикл в виде

while not SeekEOF( f ) do Read( f, ... );

он станет работать более эффективно.

Как и SeekEOLn, функция SeekEOF применима только к открытым для чтения текстовым файлам.

<p>12.6.2. Операции ввода-вывода в текстовые файлы</p>

Ввод и вывод числовой и текстовой информации в Турбо Паскале осуществляется операторами:

ввод – 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 ); { запись по полям,}

| for i:=0 to 99 do

| Read( Dim[i] ); { ввод массива }

| END.

Всякие попытки вставить «сокращения» типа Read (Rec) или Read (Dim) вызовут понятное возмущение компилятора. Такое возможно лишь при вводе из типизированного файла (см. разд. 12.7).

При вводе из текстового файла, будь то файл на диске или клавиатура, необходимо помнить правила чтения значений переменных. Когда вводятся числовые значения, два числа считаются разделенными, если между ними есть хотя бы один пробел, или символ(ы) табуляции (#9), или символ(ы) конца строки (#13). Так, при выполнении оператора Read( i, r ) можно ввести значения с клавиатуры несколькими способами:

123 1.23 [Клавиша ввода]

или

123 [Клавиша ввода] 1.23 [Клавиша ввода]

При вводе с клавиатуры последней всегда должна нажиматься клавиша ввода, ибо именно она заставляет программу принять введенные перед этим буквы и цифры. При чтении из других текстовых файлов символ конца строки (код клавиши ввода), вообще говоря, ничем не лучше пробела или табуляции.

- 240 -

Если читается символьное значение, то в соответствующую переменную запишется очередной символ за последним введенным до этого. Здесь уже нет никаких разделителей:

VAR

ch1, ch2 : Char;

...

Read( ch1, ch2 );

В этом случае надо не спешить нажать клавишу ввода на клавиатуре:

аб[ВВОД] --> ch1 = 'а', ch2 = 'б'

а[ВВОД]б[ВВОД] --> ch1 = 'а', ch2 = #13

[ВВОД][ВВОД] --> ch1 = #13, ch2 = #13

Перейти на страницу:

Поиск

Похожие книги