Послідовний доступ означає, що кожний наступний елемент файлу може бути прочитаним тільки після читання попереднього. Послідовний доступ є природнім для всіх типів файлів.
Прямий доступ визначає можливість позиціонувати в файлі на довільний запис.
Послідовний доступ може бути використано для файлів довільного типу. Прямий - тільки для типізованих та безтипових файлів. Це зв¢язано з тим, що в текстових файлах, організованих по рядках, довжина рядка може бути довільною і прочитати, наприклад, третій рядок неможливо не прочитавши два попередні. В компонентних та безтипових файлах розмір кожного елементу (запису) має визначений розмір. Тому можна завжди підрахувати положення конкретного N-го запису. Для цього потрібно розмір запису помножити на кількість записів, що передують даному (N-1)
Нумерація записів починається з 0.
Процедури та функції для прямого доступу:
Процедури або функції
| Д і я
|
FileSize (F)
| Повертає число записів в файлі
|
FilePos (F)
| Повертає номер поточного запису
|
Seek (F,<номер запису>)
| Встановлює поточним вказаний запис
|
Truncate (F)
| Відсікає частину файлу, починаючи з поточного запису до кінця файлу
|
Щоб дописати дані в файл, необхідно встановити файловий указник після останнього запису. Для цього потрібно виконати процедуру Seek(f,FilePos(f));
Розробка програм з використанням файлів.
При читанні файлу завжди необхідно використовувати цикл тільки
While not eof(f) do
Приклад 1.Сформувати текстовий файл з довільних рядків. Завершити введення вводом символу *. Вивести вміст файлу, пропускаючи пусті рядки, і підрахувати кількість пустих рядків.

Program TFile;
var
F:text;
k:integer;
s:string;
begin
assign (f,'File.txt');
rewrite (f);
writeln (’Введіть рядки’);
Repeat
Readln (S);
Writeln (F,s);
Until S=’*’;
Flush (f);
Reset (f);
k:=0;
while not eof(f) do
begin
readln (f,S);
if S<>’’ then writeln (S)
else inc(k);
end;
writeln (’В файлі ’,k,’ пустих рядків’);
close (f);
end.
Приклад 2.Висхідний файл вміщує текст, розбитий на рядки довільної довжини. Створити новий файл, який буде вміщувати той же текст, але рядки будуть довжиною 20 символів.
Program TextFile;
var
F,N:text; {файлові змінні}
ch:char;
k:integer; {кількість символів}
s:string;
begin
assign (f,'old.txt');
{відкриття існуючого файлу}
reset (f);
assign (n,'new.txt');
{файл не існує, або існуючий очищуємо}
rewrite (n);
k:=0; {}
while not eof(f) do
begin
read (f,ch);
if eoln(f) then
readln (f); {якщо символ „кінець рядку”, то
читаємо інший символ}
inc(k);
if k>20 then
begin
writeln(n);
k:=1;
end;
write (n,ch);
end;
flush (n);
reset (n);
while not eof (n) do
begin
readln (n,s);
writeln (s);
end;
close (f);
close (n);
end.
Вмістиме файлу old.txt:
Good day, my dear Masha!
Haw do you do? My name is Unknown.
Good by!
Вмістиме файлу new.txt:
Good day, my dear Ma
sha!Haw do you do? M
y name is Unknown.Go
od by!
Приклад 3.Розробити програму реєстрації пасажирів аеропорту. Вивести дані про пасажирів, що зареєструвались на вказаний рейс та мають багаж не більше 30 кг.
В даному прикладі необхідно використати компонентний файл тому, що дані про кожного пасажира складаються з декількох значень. Для опису таких даних зручно використати тип даних „запис”.
Program Reyses;
type
TPas=record
Fio:string[20];
NReys:word;
Massa_bag:real;
Data:record
d,m,g:word;
end;
end;
var
F: file of TPas;
Pas:Tpas;
N:word;
begin
assign (f,'Passagir.dat');
rewrite (f);
writeln ('Реєстрація пасажирів:');
REPEAT
WRITE ('Введіть ПІБ (Для завершення вводу *)');
READLN(Pas.fio);
if Pas.Fio<>'*' then
begin
write ('Введіть рейс ');
readln (Pas.NReys);
write ('Введіть масу багажу ');
readln (Pas.massa_bag);
write ('Введіть дату вильоту (d m g)');
with Pas.Data do
readln (d,m,g);
write (f,Pas);
end;
until Pas.Fio='*';
close (f);
reset (f);
write ('Введіть номер рейсу для виводу даних ');
readln (N);
writeln (‘Список пасажирів, зареєстрованих на рейс ’,n);
while not eof (f) do
begin
read (f,Pas);
if (Pas.NReys=N) and (Pas.massa_bag<30) then
Writeln (Pas.Fio);
end;
close (f);
end.
Протокол роботи програми:
Реєстрація пасажирів:
Введіть ПІБ (Для завершення вводу *) Ivanov
Введіть рейс 123
Введіть масу багажу 25
Введіть дату вильоту (d m g)12 09 2004
Введіть ПІБ (Для завершення вводу *) Petrov
Введіть рейс 123
Введіть масу багажу 35
Введіть дату вильоту (d m g)13 09 2004
Введіть ПІБ (Для завершення вводу *) Cidorov
Введіть рейс 234
Введіть масу багажу 15
Введіть дату вильоту (d m g)13 09 2004
Введіть ПІБ (Для завершення вводу *) *
Введіть номер рейсу для виводу даних 123
Список пасажирів, зареєстрованих на рейс 123
Ivanov
Приклад 4.В файлі, що містить дані реєстрації пасажирів аеропорту, замінити номер вказаного рейсу на інший. Нові дані надрукувати.
Program KorReyses;
type
TPas=record
Fio:string[20];
NReys:word;
Massa_bag:real;
Data:record
d,m,g:word;
end;
end;
var
F: file of TPas;
T:Text;
Pas:Tpas;
N,New:word;
begin
assign (f,'Passagir.dat');
reset (f);
write ('Введіть номер рейсу, який потрібно замінити');
readln (N);
write ('Введіть новий номер рейсу);
readln (New);
while not eof (f) do
begin
read (f,Pas);
if Pas.NReys=N then
begin
Pas.NReys:=New;
seek(f,filepos(f)-1);
write (f,Pas);
end;
end;
close (f);
reset (f);
assign (T,’PRN’);
rewrite (T);
writeln (‘Список пасажирів’);
while not eof (f) do
begin
read (f,Pas);
Writeln (T,Pas.NReys,Pas.Data.d:4, Pas.Data.m:2,
Pas.Data.g);
Writeln (T,Pas.Fio);
end;
close (f);
end.
Приклад 5.З файлу, що містить дані реєстрації пасажирів аеропорту, вилучити всі дані про пасажирів, що зареєструвались на вказаний рейс.
Program DelReyses;
type
TPas=record
Fio:string[20];
NReys:word;
Massa_bag:real;
Data:record
d,m,g:word;
end;
end;
var
F: file of TPas;
T:Text;
Pas:Tpas;
N,Nz:word;
begin
assign (f,'Passagir.dat');
reset (f);
write ('Введіть номер рейсу, дані по якому потрібно вилучити');
readln (N);
while not eof (f) do
begin
read (f,Pas);
if Pas.NReys=N then
begin
Nz:=FilePos(f)-1;
while not eof (f) do
begin
read (f,Pos);
seek(f,filepos(f)-1);
write (f,Pas);
seek(f,filepos(f)+1);
end;
seek (fileSize(f)-1);
truncate (f);
seek (f,Nz);
end;
end;
close (f);
reset (f);
assign (T,’PRN’);
rewrite (T);
writeln (’Список пасажирів’);
while not eof (f) do
begin
read (f,Pas);
Writeln (T,Pas.NReys,Pas.Data.d:4, Pas.Data.m:2,
Pas.Data.g);
Writeln (T,Pas.Fio);
end;
close (f);
end.
Завдання для самоперевірки.
2. Скільки елементів може бути у файла?
3. Елементи файла повинні бути однаковими чи можуть бути різними?
4. Які типи доступу можуть бути до файлу?
5. Які дії необхідно виконати щоб дописати дані в текстовий файл?
6. Які дії необхідно виконати щоб дописати дані в компонентний файл?
7. Яким чином можна скопіювати вміст файлу в інший файл?
8. Що означає прямий доступ до файлу.
9. Яким чином система виконує запис даних до файлу.
10. Яким буде вміст файлу після виконання процедури Rewrite(f);
11. Розробити програму яка в текстовому файлі в початок кожного рядку вставляє номер цього рядку.
12. Розробити програму яка в текстовому файлі зчитує рядок вказаного номеру і виводить відповідне сповіщення якщо рядку з таким номером немає.
13. В текстовому файлі знайти найдовший рядок.
14. Розробити програму формування текстового файлу з 9 рядків, де в першому рядку буде записано одну літеру „1”, в другому - дві літери „2”, ..., в дев¢ятому - дев¢ять літер „9”.
15. Файл містить дані про студентів. По кожному студенту вказується ПІБ, курс, група, оцінки по трьом екзаменам. Надрукувати дані про студентів, що мають двійки з екзаменів.
16. Маємо два файли, що містять цілі числа, впорядковані по зростанню. Створити третій файл, об¢єднавши дані з двох заданих таким чином, щоб в ньому дані теж були впорядковані по зростанню.