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

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

Читання безтипових файлів задає процедура BLOCKREAD із чотирма параметрами. Усі вони, крім третього – параметри-змінні. У виклику процедури першим аргументом є ім’ я файлової змінної, другий задає місце в пам’ яті, з якого починається "внутрішній буфер", третій – кількість блоків, які треба прочитати з файла, а в четвертому, типу Word, повертається кількість блоків, яка насправді читається за виконання виклику. Наприклад, за означеннями

var f : file;

inbuf : array[1..100] of char;

blsz : Longint; numbl, numblre : Longint

та операторами й викликами

blsz:=4; numbl:=25;

reset(f, blsz); blockread(f, inbuf, numbl, numblre)

розмір блока встановлюється рівним 4 байти, і 25 таких блоків треба прочитати з початку файла. Якщо розмір файла насправді не менше 4*25=100 байтів, і ніяких помилок при читанні не було, то значенням змінної numblre також буде 25. Після читання масив inbuf буде заповнений до кінця, і треба буде обробити його залежно від конкретної задачі. Крім того, при виконанні наступного виклику цієї процедури файл f буде читатися зі 101-го байта.

Отже, для безтипових файлів поняття "доступний елемент" заміняється на "доступний байт".

Можливо, в файлі менше 100 байтів або при читанні щось трапилося, і насправді прочитано менше, ніж указані 25 блоків. Тоді значення змінної numblre буде не рівним 25. Після виклику можна задати перевірку numblre=numbl і відповідні дії в разі нерівності.

Якщо задати читання кількості блоків, меншої від 25, то масив inbuf буде заповнений не до кінця, а якщо більшої – то заповниться масив inbuf і відповідна кількість змінних, розташованих за ним у пам’ яті програми. Оскільки змінні розташовуються там у порядку означення, першими "жертвами" в даному разі стануть змінні blsz, numbl, numblre. Вони мають тип Longint і займають по 4 байти, тому за виконання blockread(f, inbuf, 26, numblre) буде зіпсована лише перша з них, за blockread(f, inbuf, 27, numblre) – перші дві тощо. Отже, треба бути особливо уважним при записі виклику.

Якщо блок, або "зовнішній буфер" не заповнюється до кінця, то кількість блоків, реально прочитаних, буде меншою від заданої кількості. Таким чином, для запобігання неприємностей треба забезпечити, щоб розмір файла ділився на розмір блока. Оскільки розмір блока насправді не впливає на швидкість читання, найкраще надавати йому значення 1. Тоді проблем не буде за будь-якого розміру файла.

Зрозуміло, що коли обробляється файл записів фіксованого розміру, то цей розмір можна задавати і для блока. Наприклад, записи типу

Student=record

Sname, Name : string[20];

Ball : real

end

мають розмір 21+21+6=48 (байтів). Саме це значення повертається з виклику функції

SizeOf(Student).

І взагалі, з виклику вигляду SizeOf(ім’ я-типу) повертається кількість байтів, що займаються значеннями цього типу, наприклад,

SizeOf(char)=1, SizeOf(integer)=2

тощо. Отже, файл f записів типу Student можна відкрити викликом

ReSet(f, SizeOf(Student)).

Після цього виклик вигляду

BlockRead(f, Buf, n, nreal)

задає читання n блоків по 48 байтів у пам’ ять змінної Buf.

Головну роль у швидкості читання безтипових файлів відіграє розмір "внутрішнього буфера". Чим він більше, тим менше звернень до зовнішнього носія і швидше обробка файла. Але все добре в міру.

Можете перевірити твердження, що за розмірів буфера, кратних 512 байтам і більших 8K байтів, швидкість читання файлів практично стала.

Процедура блочного виведення BLOCKWRITE також має 4 аналогічні параметри. Відмінність її в тім, що дані з "внутрішнього буфера" через блок записуються в кінець файла. Зрозуміло, спочатку для файла треба установити розмір "зовнішнього" буфера викликом вигляду ReWrite(f, m).

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