12.6.1.3. Процедура Flush( VAR f: Text). Эта процедура применяется к файлам, открытым для записи (процедурами Rewrite или Append). Данные для записи накапливаются в буфере файла и только после полного его заполнения записываются в физический файл. Процедура Flush принудительно записывает данные из буфера в файл независимо от степени его заполнения. Когда буфер имеет большую емкость, его содержимое может не попасть в физический файл, если программа внезапно прервется в процессе счета. Этого можно избежать, если перед «аварийными» частями программы ставить вызовы Flush.
Процедура Flush не закрывает файл и не влияет на последовательность вывода. Flush может найти применение при работе со стандартными файлами MS-DOS: устройствами AUX, или COM1, COM2,...,PRN, или LPT1 LPT3. При работе с ними данным незачем «отстаиваться » в буфере, и процедура Flush, поставленная после Write, снимет эффект задержки буфера файла.
12.6.1.4. Функция EOLn( VAR f: Text) : Boolean. Эта функция анализирует текущее положение в текстовом файле f, открытом для чтения. Расшифровка этой функции говорит сама за себя:
- 236 -
«End-Of-Line» — конец строки. EOLn возвращает значение True, если следующей операцией будет прочитан признак конца строки (символ #13) или конца файла (символ #26) и False во всех прочих случаях. Функция как бы предчувствует результат предстоящего чтения и анализирует его. Необходимость в EOLn( f ) возникает всякий раз, когда заранее не известно, где встретится конец строки. Пусть у нас имеется файл со столбцами цифр (рис. 12.5).
DIGITS.DAT
12.3 13.2 14.4 5.7 126.0[13][10]
17.8 -7.6 100 456 987.6[13][10]
55.5 6.06 7.8 0.00 10.11[13][10]
[26]
Рис. 12.5
Как автоматически определить число столбцов в нем и наладить чтение? С помощью EOLn (рис. 12.6).
| VAR
| f :Text; { логический текстовый файл }
| NCol :Byte; { счетчик числа столбцов }
| R :Real; { число для чтения из файла }
| BEGIN
| Assign( f, 'DIGITS.DAT' ); { связывание файлов }
| Reset ( f ); { открытие f для чтения }
| Ncol := 0; { стартовое значение Ncol}
| while NOT EOLn(f) do
| begin { Цикл до конца строки: }
| Read( f, R ); { чтение вправо по строке}
| Inc( Ncol ) { увеличение счетчика столбцов }
| end; {while} { конец цикла счета столбцов }
| Reset( f ); { возврат на 1-ю позицию в файле }
| { ... и повторение чтения, уже зная число столбцов }
| END.
Рис. 12.6
Существует разновидность функции EOLn без параметров. В этом случае считается, что действие ее относится к стандартному файлу Input, т.е. вводу с клавиатуры. Здесь функция EOLn возвращает True не перед, а после прохождения признака конца строки: сразу после нажатия клавиши ввода. Более того, от EOLn без параметра не дождетесь значения False. Она «подвешивает» программу и возвра-
- 237 -
щает управление следующему оператору только после нажатия ввода. В руководстве языка приводится способ организовать паузу до нажатия ввода:
WriteLn(EOLn);
12.6.1.5. Функция SeekEOLn( VAR f: Text): Boolean.Эта функция является «ближайшей родственницей» функции EOLn (f). Файл f должен быть текстовым и открытым для чтения. Функция возвращает значение True, если до конца строки (символ #13) или конца файла (символ #26) могут быть считаны только пробелы и (или) символы табуляции (символ #9). Значение True также вернется, если текущее положение в файле непосредственно предшествует символам #13 или #26. Другими словами, SeekEOLn всегда вернет True, если EOLn на ее месте вернет True. Но в отличие от EOLn функция SeekEOLn как бы «видит» конец строки (или файла) через пробелы и знаки табуляции.
SeekEOLn ориентирована, главным образом, на работу с текстовыми файлами чисел. Последний пример из описания EOLn можно было бы переписать, заменив EOLn на SeekEOLn. От этого он заработал бы только лучше. Действительно, чтобы EOLn вернула True, нужно «упереться» в признак конца. А для этого надо убедиться, что «пустопорожние» пробелы после последнего числа в строке не являются числами: съедается время. SeekEoLn же игнорирует все пробелы и табуляции и «видит» конец издалека, ускоряя обработку.