Паскаль: буферизація введення-вивединня, Детальна інформація

Паскаль: буферизація введення-вивединня
Тип документу: Реферат
Сторінок: 8
Предмет: Комп`ютерні науки
Автор: Олексій
Розмір: 18.8
Скачувань: 1200
begin

assign(f, 'boo.dat'); fillbuf; spoilbuf;

close(f)

end.

При виконанні виклику fillbuf символи abcde заповнюють внутрішній буфер і скидаються в зовнішній. Потім, уже при виконанні close(f) вони з’ являються у файлі boo.dat. Але символи fgh залишаються у внутрішньому буфері після закінчення fillbuf і псуються під час виконання spoilbuf. Зіпсований буфер скидається при закриванні файла f, і потім замість fgh ми бачимо у файлі щось зовсім на них не схоже.

Задачі

15.1. Написати процедуру копіювання текстів із власними внутрішніми буферами розміром у 16 блоків, тобто 8192 байти, або 8K.

15.2. Написати процедуру побайтового порівняння текстів із власними внутрішніми буферами.

3. Буферизація екрана та клавіатури

Екран і клавіатура є текстами, зв’ язаними з файловими змінними 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, тобто фактично буфер скидається.

Oe

За виклику функції EOF аналізується внутрішній буфер клавіатури. Якщо він порожній, то виконання програми зупиняється до найближчого натискання клавіш. Тоді символи з буфера клавіатури переносяться у внутрішній до появи Enter. За наявності символів у внутрішньому буфері аналізується перший, поточний символ. Якщо він відповідає сполученню клавіш Ctrl-Z, яким задається кінець файла на клавіатурі, то з виклику eof повертається значення true. За іншого першого символу, тобто при натисканні клавіші, відмінної від Ctrl-Z, повертається false.

Приклад. Нехай діє означення var V : integer, а клавіші не натискалися до початку виконання такого фрагмента програми:

V := 0;

The online video editor trusted by teams to make professional video in minutes