русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Послідовний та прямий доступ до файлів Pascal


Дата додавання: 2014-05-08; переглядів: 2345.


 

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

Прямий доступ визначає можливість позиціонувати в файлі на довільний запис.

Послідовний доступ може бути використано для файлів довільного типу. Прямий - тільки для типізованих та безтипових файлів. Це зв¢язано з тим, що в текстових файлах, організованих по рядках, довжина рядка може бути довільною і прочитати, наприклад, третій рядок неможливо не прочитавши два попередні. В компонентних та безтипових файлах розмір кожного елементу (запису) має визначений розмір. Тому можна завжди підрахувати положення конкретного 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. Маємо два файли, що містять цілі числа, впорядковані по зростанню. Створити третій файл, об¢єднавши дані з двох заданих таким чином, щоб в ньому дані теж були впорядковані по зростанню.

 


<== попередня лекція | наступна лекція ==>
Файли Pascal | Посилання. Динамічні структури


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн