Буферизація екрана та клавіатури
Екран і клавіатура є текстами, зв’ язаними з файловими змінними output і input. Для роботи з ними також уживаються буфери.
Спочатку розглянемо екран. З ним зв’ язаний буфер, але символи, потрапивши в нього, одразу копіюються на екран. Якби цього не було, інформація на екрані з’ являлася би з небажаними затримками.
При виконанні процедури WRITE за значенням її кожного аргумента обчислюється стала, тобто послідовність символів, які через буфер одразу виводяться на екран. Насправді, виклик
write(E1, E2, … , EN )
виконується як послідовність викликів
write ( E1 ); write ( E2 ); … ; write ( EN ).
Виконання writeln відрізняється тим, що в буфер екрана "додається eol", і курсор переводиться в наступний рядок.
Організація роботи з клавіатурою набагато складніше. Символи, утворені натисканням клавіш, накопичуються в буфері клавіатури. Він уміщає 15 символів. У цьому можна переконатися, запустивши програму
uses crt;
begin delay(16000) end.
При її виконанні протягом 16 секунд неважко встигнути натиснути якусь клавішу 16 разів і за останнього натискання почути звуковий сигнал комп’ ютера, що свідчить про переповнення буфера клавіатури. Буфер переповнюється, оскільки за виконання цієї програми символи з нього не переносяться у внутрішній буфер. Крім того, набрані далі символи не відображаються на екрані і взагалі "зникають".
Перенесення символів у внутрішній буфер відбувається за виконання процедур читання readln і read. Як і для інших текстів, його розмір 128 байтів. У цьому можна переконатися, запустивши програму
begin readln end.
За її виконання комп’ ютер починає чекати натискань на клавіші. Кожне натискання на клавішу (крім Enter) приводить до появи відповідного символу в буфері клавіатури. Цей символ одразу переноситься в її внутрішній буфер та через екранний буфер без затримки відображається на екрані. Після того, як набрано 128 символів, наступний символ до внутрішнього буфера не переноситься й на екрані не з’ являється. Натомість можна почути звуковий сигнал, що свідчить про переповнення внутрішнього буфера.
Натискання на клавішу Enter веде до появи відповідного символу в буфері клавіатури та переведення курсора в новий рядок екрана. Коли цей символ з’ являється у внутрішньому буфері, рядок у ньому розглядається як "завершений символом eol".
Завершений рядок у внутрішньому буфері аналізується й за сталими в ньому обчислюються значення базових типів та присвоюються змінним, указаним у виклику read (readln). Якщо сталих менше, ніж змінних у виклику, то виконання продовжується, тобто внутрішній буфер спорожнюється та починається чекання нових символів із клавіатури.
Коли в черговому рядку проаналізовано останню сталу, поточним стає наступний за нею символ у внутрішньому буфері. Виконання процедури read на цьому закінчується. За наступного виконання процедури читання нові символи будуть додаватися до змісту внутрішнього буфера, але пошук і аналіз сталих почнеться від поточного символу буфера, що залишився від попереднього виклику read. Особливість процедури readln полягає в тім, що після аналізу останньої сталої решта символів у внутрішньому буфері пропускаються разом із найближчим eol, тобто фактично буфер скидається.