Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОП Конспект лекций - Паскаль.doc
Скачиваний:
20
Добавлен:
30.11.2018
Размер:
1.46 Mб
Скачать

Тема 24: Послідовний та прямий доступ до файлів

На відміну від масиву довжина файлу не задається, а місце елемента не визначається індексом. Файл, структурно організований як послідовність елементів, де кожен елемент стає доступним після перебору всіх попередніх елементів, називається послідовним. Файл, збережений на диску, називається зовнішнім чи вхідним файлом. У Pascal-програмі представником файлу є змінна файлового типу, що інтерпретує файл як нескінченний список значень того самого базового типу. Зі змінною файлового типу пов’язане поняття поточного покажчика файлу. Поточний покажчик – це схована змінна, тобто вона неявно описана разом з файловою змінною, і вказує на деякий конкретний елемент файлу. Графічна інтерпретація файлу, пов'язаного з файловою перемінною має вигляд зображений на рис.24.1:

Поточний покажчик

Рисунок 24.1. Графічна інтерпретація файлу

Читання з файлу чи запису у файл виконується поелементно, причому записується чи зчитується той елемент файлу, що позначений поточним покажчиком. При цьому покажчик переміщується, указуючи той чи інший елемент. Всі елементи файлу пронумеровані; перший елемент має нульовий номер.

Компоненти бінарного файлу мають однаковий розмір. Цим зумовлені певні переваги бінарного файлу над текстовим. По-перше, стає можливим прямий доступ до компонентів файлу за їхніми номерами. Під прямим доступом розуміється можливість встановлювати файловий покажчик на заданий компонент без послідовного перебирання попередніх компонентів. По-друге, відкриття бінарного файлу процедурою Reset робить можливим як читання, так і запис довільних компонентів файлу без руйнації його вмісту. Це пояснюється тим, що модифікація кількох компонентів усередині бінарного файлу не призведе до зміни їх розміру, а отже, не потребуватиме зсуву інших компонентів. Нагадаємо, що процедура Rewrite також відкриває бінарний файл у режимі читання і запису, але при цьому вона знищує його вміст (якщо файл уже існував).

Прямий доступ до компонентів бінарного файлу в мові Pascal здійснюється за допомогою процедур та функцій, наведених у табл. 24.1.

Таблиця 24.1. Процедури та функції прямого доступу до компонентів файлів

Ім'я функції або процедури

Призначення

Seek(var f; n: Longint);

Переміщує файловий покажчик на компонент з номером n. Файл f має бути відкритий

Truncate(var f);

Видаляє всі компоненти файла f від поточного компонента до кінця файла

FilePos(var f): Longint;

Повертає номер запису, на який посилається файловий покажчик

FileSize(var f): Longint;

Повертає кількість компонентів файла f

Треба взяти до уваги, що процедури Seek, Truncate і функція FilePos не працюють з текстовими файлами.

Приклад 1

Обчислити кількість компонентів в файлі дійсних чисел, вивести вміст файлу на екран.

var

f: file of real;

a: real;

i: word;

begin

assign(f, ’abc.dat’);

reset (f);

writeln(‘в файлі ’,filesize(f), ‘ чисел’);

for i:= 1 to filesize(f) do

begin

read(f, a);

write(a, ‘ ’);

end;

close(f);

end.

Приклад 2

В файлі цілих чисел поміняти місцями максимальний та мінімальний елементи.

var

f: file of integer;

a, i, max, nmax, min, nmin: integer;

begin

assign(f, ’abc.int’);

reset (f);

for i:= 1 to filesize(f)-1 do

read(f, a);

if i=0 then

{початкове привласнення максимального}

{і мінімального значень і їх індексів}

begin

max:=a; nmax:= i;

min:=a; nmin:=i;

end

else

begin

{порівняння поточного значення з максимальним (мінімальним)}

if max<a then

begin

max:=a;

nmax:= i;

end;

if min >a then

begin

min:=a;

nmin:=i;

end

end

end;

{перезапис максимального і мінімального значень у файл}

seek(f, nmax);

write(f, min);

Seek(f,nmin);

write(f,max);

end.

Питання для контролю.

  1. В чому різниця між прямим та послідовним доступом до файлу?

  2. Які функції здійснюють прямий доступ?

  3. Які процедури здійснюють прямий доступ?

  4. Які з перелічених процедур і функцій не можна використовувати для текстових файлів?