ПАСКАЛЬ: БУФЕРИЗАЦІЯ ВВЕДЕННЯ-ВИВЕДЕННЯ
Натискання на клавішу Enter веде до появи відповідного символу в буфері клавіатури та переведення курсора в новий рядок екрана. Коли цей символ з’ являється у внутрішньому буфері, рядок у ньому розглядається як "завершений символом eol".
Завершений рядок у внутрішньому буфері аналізується й за сталими в ньому обчислюються значення базових типів та присвоюються змінним, указаним у виклику read (readln). Якщо сталих менше, ніж змінних у виклику, то виконання продовжується, тобто внутрішній буфер спорожнюється та починається чекання нових символів із клавіатури.
Коли в черговому рядку проаналізовано останню сталу, поточним стає наступний за нею символ у внутрішньому буфері. Виконання процедури read на цьому закінчується. За наступного виконання процедури читання нові символи будуть додаватися до змісту внутрішнього буфера, але пошук і аналіз сталих почнеться від поточного символу буфера, що залишився від попереднього виклику read. Особливість процедури readln полягає в тім, що після аналізу останньої сталої решта символів у внутрішньому буфері пропускаються разом із найближчим eol, тобто фактично буфер скидається.
За виклику функції EOF аналізується внутрішній буфер клавіатури. Якщо він порожній, то виконання програми зупиняється до найближчого натискання клавіш. Тоді символи з буфера клавіатури переносяться у внутрішній до появи Enter. За наявності символів у внутрішньому буфері аналізується перший, поточний символ. Якщо він відповідає сполученню клавіш Ctrl-Z, яким задається кінець файла на клавіатурі, то з виклику eof повертається значення true. За іншого першого символу, тобто при натисканні клавіші, відмінної від Ctrl-Z, повертається false.
Приклад. Нехай діє означення var V : integer, а клавіші не натискалися до початку виконання такого фрагмента програми:
V := 0;
while not eof do
begin
write( 'Задайте ціле число>' ); read( V )
end;
writeln ( 'V=', V:1 )
При виконанні eof комп'ютер чекає натискань на клавіші. Запрошення до введення числа на екрані ще не з’ явилося. Якщо натиснути Ctrl-Z та Enter, то з виклику eof повертається false, і виконання фрагмента закінчується друкуванням тексту V=0. За натискань цифрових клавіш цифри відображаються на екрані й накопичуються у внутрішньому буфері клавіатури. Після натискання на Enter виконання eof закінчується й повертається значення false. Після цього, тобто лише після набору на клавіатурі першої сталої (!) виконується тіло циклу і з'являється запрошення 'input number>'.
При виконанні read лише аналізуються символи, накопичені у внутрішньому буфері за виконання виклику eof. Якщо вони утворюють сталу, то відповідне значення присвоюється змінній V, після чого повторюється виклик eof тощо. Отже, введення символів із клавіатури в такому циклі відбувається за викликів eof, а не read! Таким чином, щоб запрошення друкувалося до початку введення першої сталої, варто перед циклом додати виклик write('input number>').
Ще раз повернемося до уживання процедури readln замість read. Якщо при виконанні наведеного циклу за черговою сталою після пропуску випадково набрати непорожні символи, що не задають сталу, то вони залишаться у внутрішньому буфері. Далі з виклику eof повернеться false, і аналіз цих символів за виконання read призведе до аварійного завершення програми. Якщо ж замість read записати readln, то після обробки сталої ці символи пропускаються, тому що набираються перед Enter, і програма виконується нормально.
15.4. Тип безтипових файлів