| 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
И, наконец, ввод строк. Начало строки идет сразу за последним введенным до этого символом (с первой позиции, если соответствующая строчная переменная стоит первой в списке ввода). Считывается количество символов, равное объявленной длине строки. Но если во время считывания попался символ #13, то чтение строки прекращается. Сам символ #13 (конец строки) служит разделителем строк и в переменную никогда не считывается.
Рассмотрим пример комплексного списка ввода:
Read( realVar, intVar, Ch, String11, String88).
При вводе последовательность символов будет разбита на разнотипные части следующим образом ([#13] обозначает один символ с кодом 13):
Обратите внимание, что символьная переменная Ch здесь может заполучить себе только пробел (или #13 и #9), иначе, если следом сразу начнется строка, произойдет сбой при чтении целого значения! Строка StringSS будет заполнена не целиком, а на ту часть, которая успела считаться до символа #13 (нажатия клавиши ввода или конца строки в файле).
Понятно, что лучшим способом избежать заложенных во вводе текстовой информации подвохов будет отказ от смешанных списков ввода, по крайней мере при чтении с клавиатуры.