Л а б о р а т о р н а р о б о т а N 9
ОБРОБКА ФАЙЛIВ ЗАСОБАМИ МОВИ ТУРБО-ПАСКАЛЬ
Файл - сукупнiсть логiчно пов'язаних та органiзованих певнним чи-
ном даних на зовнiшньому носiї iнформацiї (диску). Турбо-Паскаль роз-
глядає три класи файлiв:
- текстовi;
- типованi;
- нетипованi.
Текстовий файл складається з послiдовностi рядкiв символiв, кожен
з яких закiнчується парою кодiв #13#10 ("перевiд рядка", "повернення
каретки"). Оскiльки рядки файла майть рiзну довжину, то текстовi файли
є файлами послiдовного доступу. Тобто, ввiд/вивiд n-го рядка файла мож-
ливий лише пiсля зчитування/запису попереднiх (n-1) рядкiв, а сам файл
вiдкривається тiльки для читання або тiльки для запису.
Типований файл складається iз записiв (компонент) одного з допус-
тимих у Паскалi типiв. Всi компоненти типованого файла мають однаковий
розмiр, що визначається розмiром базового елемента. Тому можливим є
доступ до кожного запису файла за його номером. Типовананi файли є фай-
лами прямого доступу i вiдкриваються одразу для читання i для запису.
Нетиповананi файли Турбо-Паскаль розглядає як сукупнiсть символь-
них або байтових значень, незалежно вiд того, елементами яких даних во-
ни є. Практично це означає, що кожен файл типований чи текстовий може
розглядатись як нетипований, важливим є лише його розмiр. Нетипованi
файли забезпечують максимальну швидкодiю при вводi/виводi iнформацiї,
оскiльки не потребують затрат часу на перетворення даних. Нетипованi
файли також вiдкриваються для вводу/виводу одночасно.
Кожному файлу в програмi ставиться у вiдповiднiсть файлова змiнна
одного з трьох типiв (за класом файла). А процес роботи з файлами вклю-
чає наступнi етапи:
- опис файлової змiнної (типи text, file of <базовий тип>, file);
- встановлення зв'язку мiж файловою змiнною та конкретним фiзичним
файлом (процедура Assign);
- вiдкривання файла (процедури Reset, Rewrite, Append);
- обмiн даними з файлом - ввiд/вивiд (процедури Read, Readln,
BlockRead, Write, Writeln, BlockWrite);
- закриття файла (процедура Close).
Кожен клас файлiв має свої особливостi при виконаннi названих
етапiв. Крiм наведених операцiй Турбо-Паскаль дозволяє здiйснювати
аналiз помилок при роботi з файлами (за допомогою функцiї IOResult),
перемiщення по файлу (процедура Seek, функцiя SeekPos), встановлення
статуса кiнця рядка та кiнця файла (функцiї EOLn, EOF, SeekEOLn,
SeekEOF), визначення розмiру файла ( функцiя FileSize), перейменування
(процедура Rename) та витирання файла (процедура Truncate) та iншi дiї.
Список стандартних процедур та функцiй для роботи з файлами наведений у
наступних таблицях.
Перелiк стандартних процедур та функцiй модуля System
для роботи з файлами
I.Процедури
------------------------------T---------------------------------------¬
¦ Синтаксис ¦ Змiст ¦
+-----------------------------+---------------------------------------+
¦Append (Var f:text); ¦Вiдкриває iснуючий текстовий файл для¦
¦ ¦доповнення (запису в кiнець); ¦
¦ ¦f - файлова змiнна. ¦
¦Assign (Var f; name:string); ¦Пов'язує файлову змiнну f з зовнiшнiм¦
¦ ¦файлом, iм'я якого задається параметром¦
¦ ¦name (змiнна або символьний рядок). Як-¦
¦ ¦що файл розташований в iншому каталозi,¦
¦ ¦то необхiдно вказати шлях до нього. ¦
¦BlockRead (Var f:file; ¦Читає з нетипованого файла n записiв¦
¦ Var buf; n:word; ¦даних у область пам'ятi, видiлену для¦
¦ [; Var result:word]); ¦змiнної buf; ¦
¦ ¦f - змiнна нетипованого файла; ¦
¦ ¦buf - змiнна довiльного типу, що задає¦
¦ ¦буферну область, куди заноситься iнфор-¦
¦ ¦мацiя з файла; ¦
¦ ¦result - (необов'язковий параметр) по-¦
¦ ¦вертає число фактично зчитаних блокiв. ¦
¦BlockWrite (Var f:file; ¦Записує у файл n блокiв даних з областi¦
¦ Var buf; n:word; ¦пам'ятi змiнної buf (див. BlockRead). ¦
¦ [; Var result:word]); ¦ ¦
¦Close (Var f); ¦Закриває вiдкритий файл. ¦
¦Erase (Var f); ¦Витирає закритий файл, який представляє¦
¦ ¦змiнна f. ¦
¦Flush (Var f:text); ¦Переносить у текстовий файл iнформацiю¦
¦ ¦з буфера виводу. ¦
¦Read (f,v1[,v2,...vk]); ¦Якщо f - типований файл, то читає бiжу-¦
¦ ¦чу його компоненту у змiнну v1. ¦
¦ ¦Якщо f - текстований файл, то читає од-¦
¦ ¦не або бiльше послiдовних значень у¦
¦ ¦змiннi v1,...vk. ¦
¦Readln (Var f:text; ¦Виконує Read-процедуру текстового файла¦
¦ v1[,v2,...vk]); ¦з наступним переходом на новий рядок. ¦
¦Rename (Var f; ¦Перейменовує закритий файл, представле-¦
¦ newname:string); ¦ний змiнною f на нове iм'я, задане па-¦
¦ ¦раметром newname. ¦
¦Reset (Var f[:file; ¦Вiдкриває iснуючий файл i встановлює¦
¦ recsize:word]); ¦вказiвник на його початок: ¦
¦ ¦текстовий файл - вiдкривається тiльки¦
¦ ¦для читання; ¦
¦ ¦типований i нетипований файли вiдкрива-¦
¦ ¦ються для читання i запису. ¦
¦ ¦Для нетипованого файла додатково за-¦
¦ ¦дається розмiр запису у байтах. ¦
¦Rewrite (Var f[:file; ¦Створює i вiдкриває новий файл або¦
¦ recsize:word]); ¦вiдкриває для запису iснуючий (занесена¦
¦ ¦попередньо у файл iнформацiя при цьому¦
¦ ¦витирається). ¦
¦Seek (Var f; n:longint); ¦Встановлює вказiвник файла на компонен-¦
¦ ¦ту з номером n. ¦
¦SetTextBuf (Var f:text; ¦Створює буфер крористувача для обмiну¦
¦ Var buf[;size:word]); ¦даними з текстовим файлом; ¦
¦ ¦buf - змiнна достатнього розмiру, щоб¦
¦ ¦вмiстити всю iнформацiю* ¦
¦ ¦size - (необов'язковий параметр) визна-¦
¦ ¦чає розмiр буфера. Без нього буфер має¦
¦ ¦розмiр змiнної buf. ¦
¦Truncate (Var f); ¦Витирає частину файла, яка розташована¦
¦ ¦за позицiєю курсора. ¦
¦Write (f,v1[,v2,...vk]); ¦Якщо f - типований файл, то записує¦
¦ ¦значення змiнної v1 у бiжучу компоненту¦
¦ ¦файла. ¦
¦ ¦Якщо f - текстовий файл, то заносить¦
¦ ¦значення змiнних v1,...vk у бiжучий ря-¦
¦ ¦док файла. ¦
¦Writeln (Var f:text; ¦Заносить данi у текстовий файл як про-¦
¦ v1[,v2,...vk]); ¦цедура Write, виставляючи в кiнцi мар-¦
¦ ¦кер кiнця рядка. ¦
L-----------------------------+----------------------------------------
II. Функцiї.
---------------------T---------------------------T---------------------¬
¦ Синтаксис ¦ Значення, що повертається ¦ Пояснення ¦
+--------------------+---------------------------+---------------------+
¦EOF (Var f):boolean ¦true - при досягненнi кiнця¦f - змiнна вiдкритого¦
¦ ¦файла; ¦файла будь-якого кла-¦
¦ ¦false - в iнших випадках. ¦су. ¦
¦EOLn (Var f:text): ¦true - при досягненнi кiнця¦f - змiнна текстового¦
¦ boolean ¦рядка; ¦файла. ¦
¦ ¦false - в iнших випадках. ¦ ¦
¦FilePos (Var f): ¦Номер запису файла, на яко-¦f - змiнна типованого¦
¦ longint ¦му розташований вказiвник. ¦або нетипованого фай-¦
¦ ¦ ¦ла. ¦
¦FileSize (Var f): ¦Кiлькiсть записiв (розмiр)¦Розмiр файла в байт-¦
¦ longint ¦файла. ¦тах можна визначити: ¦
¦ ¦ ¦FileSize(f)*Sizeof(a)¦
¦ ¦ ¦де Sizeof(a) - довжи-¦
¦ ¦ ¦на компоненти файла. ¦
¦IOResult: word ¦Повертає код результату ви-¦Функцiя без парамет-¦
¦ ¦конання останньої операцiї¦рiв. ¦
¦ ¦вводу/виводу: при успiшному¦ ¦
¦ ¦завершеннi - 0, при невда-¦ ¦
¦ ¦лому - код помилки. ¦ ¦
¦SeekEOF(Var f:text):¦Стан кiнця для вiдкритого¦Кiнцевi пропуски та¦
¦ boolean ¦текстового файла. ¦знаки табуляцiй iгно-¦
¦ ¦ ¦руються. ¦
¦SeekEOln ¦Стан кiнця рядка в тексто-¦Кiнцевi пропуски та¦
¦ (Var f:text): ¦вому файлi. ¦знаки табуляцiй iгно-¦
¦ boolean ¦ ¦руються. ¦
L--------------------+---------------------------+----------------------
Приклад програми.
Необхiдно створити типований файл з iнформацiєю про киги: назва,
автор, рiк видання, видавництво, наявнiсть книги в бiблiотецi, коротка
анотацiя. Данi вводяться з клавiатури.
Iснує текстовий файл з вiдповiдними даними про деякi книги: N п/п
книги, автор (1-й рядок), назва (2-й рядок), видавництво i рiк видання
(3-й рядок) - так по кожнiй книзi. Зi створеного типованого файла
здiйснити доповнення текстового файла даними про книги наявнi у
бiблiотецi та виданi не ранiше заданого року.
Program FILES;
Uses Crt;
Const MinRik=1993; ESC=#27; {27 - код клавiшi "Esc"}
Type knyga= record
nazva: string[150];
avtor: string[150];
rik: word;
vydav: string[50];
nayavn: boolean;
anotac: string
end;
Var bibliogr: file of knyga;
literat: text;
filename: string[60];
zap_bibliogr: knyga;
n,k: byte;
c: char;
pomim: boolean;
Label m;
BEGIN
clrscr;
{ Вiдкриваємо типований файл для занесення даних }
write ('Iм''я типованого файла з даними про книги - ');
readln (filename);
assign (bibliogr,filename);
rewrite (bibliogr);
gotoXY (30,whereY+1);
writeln ('Введiть данi про книги');
gotoXY (17,whereY);
writeln ('( для завершення "Esc" замiсть назви книги )');
n:=1; { n - номер книги, iнформацiя по якiй вводиться }
{ Цикл створення типованого файлу з даними про книги }
repeat
with zap_bibliogr do begin
writeln;
{ Ввiд даних про n-ну книгу }
writeln ('Книга ',n,':');
write (' Назва - ');
c:=readkey; if c=ESC then break;
write (c); readln (nazva);
write (' Автор - '); readln (avtor);
write (' Рiк видання та видавництво - '); readln (rik,vydav);
write (' Наявнiсть в бiблiотецi (Так/Нi) - ');
m: readln (c);
case c of
'т','Т': nayavn:=true;
'н','Н': nayavn:=false;
else writeln ('Введiть Т або Н'); goto m;
end;
writeln (' Анотацiя (до 255 символiв):');
readln (anotac)
end;
{ Занесення введеної iнформацiї у запис файла }
write (bibliogr,zap_bibliogr);
Inc (n);
until false;
writeln;
writeln ('Створено типований файл ', filename,
' з повною iнформацiєю про ', n-1, ' книги');
writeln;
{ Вiдкриваємо iснуючий текстовий файл для читання,
щоб визначити номер останнньої занесеної в нього книги }
{$I-} { вiдключаємо контроль вводу/виводу }
repeat
write ('Iм''я текстового файла з даними про книги - ');
readln (filename);
assign (literat,filename);
reset (literat);
pomim:=false; { pomim - наявнiсть помилки в iменi файла }
if IOResult<>0 then begin
pomim:=true;
writeln (' Помилка в iменi файла !!!')
end;
until not pomim;
{$I+}
n:=0;
{ Читаємо файл, пiдраховуючи кiлькiсть рядкiв у ньому }
while not EOF(literat) do begin
readln (literat);
Inc(n)
end; close (literat);
k:=n div 3; n:=k; {n=k - номер останнньої книги з текстового файла }
{ Вiдкриваємо файл для доповнення новими даними }
append (literat);
{ Встановлюємо вказiвник типованого файла на його початок }
seek (bibliogr,0);
{ Цикл читання записiв типованого файла та вибору з них даних,
якi заносяться в кiнець текстового файла }
while not EOF(bibliogr) do begin
read (bibliogr,zap_bibliogr);
with zap_bibliogr do
if (rik>=MinRik) and nayavn then begin
Inc (n);
writeln (literat,' ',n,'. ',avtor);
writeln (literat,' ',nazva);
writeln (literat,' ',vydav,':',rik)
end
end;
writeln;
writeln ('Файл доповнено даними про ',n-k,' книги');
readln;
close (bibliogr); close (literat)
END.
Завдання лабораторної роботи
1. Засобами одного з текстових редакторiв (вбудованого чи альтер-
нативного редактора Norton Commander або редактора iнегрованого сере-
довища Турбо-Паскаль) створити текстовий файл з iнформацiєю у вiд-
повiдностi до iндивiдуального завдання (6-20 рядкiв даних). Занести
файл у свiй каталог.
2. Програмно органiзувати створення нового типованого файла з за-
писiв, кожен з яких представляє у стислiй формi iнформацiю з одного
рядка вхiдного файла.
3. Аналiзуючи в програмi данi зi створеного файла записiв, вико-
нати над ними заданi перетворення та вивести на екран дисплея вказану
в iндивiдуальнiм завданнi iнформацiю.
4. Вiдлагодити та реалiзувати розроблену програму.
5. Переглянути створений типований файл. Порiвняти його за
розмiром з вхiдним текстовим. Зробити висновки.

Варiанти iндивiдуальних завдань
1. Облiк виробiв, наявних на складах пiдприємства
N складу ¦ Шифр виробу ¦ Найменування ¦ К-сть ¦ Вiдповiдальний
----------+-------------+--------------------+--------+----------------
Витерти в створеному типованому файлi записи з даними про вироби,
шифр яких починається кодовою комбiнацiєю "А80". Роздрукувати вмiст
перетвореного файлу.
2. Список членiв громадської спiлки
¦ ¦ ¦ ¦ Дата реєстрацiї
N п/п ¦ П.I.П. ¦ Вiк ¦ Стать ¦ День¦Мiсяць¦Рiк
-------+---------------------+---------+--------+-----+------+-----
Вивести список жiнок, зареєстрованих до 1 липня 1993 року.
3. Результати екзаменацiйної сесiї студентiв групи
¦ Оцiнки ¦
¦ +--------T------T--------T-------T-------+
N п/п ¦ П.I.П. студента ¦Математ.¦Фiзика¦Програм.¦Iсторiя¦Iн.мова¦
-------+-------------------+--------+------+--------+-------+-------+
Визначити студента (студентiв) групи з максимальним середнiм балом.
4. Облiк проданих касою залiзничних квиткiв
Дата ¦ ¦ ¦ ¦ Станцiя
вiдправлення ¦ N поїзда ¦ Вагон ¦ Мiсце ¦ призначення
--------------+----------+-------+-------+-------------
Пiдрахувати загальну кiлькiсть квиткiв, проданих до ст. Київ
на 1 грудня 1994 року.

5. Iнформацiя про результати дiяльностi цехiв пiдприємства за
тиждень
¦ Найменування ¦ Шифр ¦ План ¦ Фактичний
N цеху ¦ виробу ¦ виробу ¦ роботи ¦ випуск
--------+--------------------+------------+----------+------------
Надрукувати список виробiв, в шифрi яких мiстяться "7", по яких
не виконано план випуску за тиждень.
6. Облiк пацiєнтiв, якi звертались за медичною допомогою
¦ Наявнiсть
П.I.П. хворого¦ Вiк ¦ Адреса ¦ Дiагноз ¦ Код захворюв.¦лiкар.листа
--------------+-----+---------+----------------+--------------+-----------
Вивести список хворих, якi перебувають на лiкарняному листi, в кодi
захворювання яких немає комбiнацiї "А3".
7. Данi про розподiл стипендiї по групах 1-го курсу
Група ¦ К-сть студентiв ¦ Отримують стипендiю ¦ Староста
---------+-----------------+---------------------+--------------
Вивести список груп, вказавши прiзвище та iм'я старости, в яких
понад 90% студентiв отримують стипендiї.
8. Облiк книг домашньої бiблiотеки
¦ ¦ Рiк ¦ К-сть
Автор ¦ Найменування книги ¦ видання ¦ сторiнок
--------------+-----------------------------+---------+----------
Надрукувати перелiк книг, виданих пiсля 1992 року та присвячених
програмуванню на мовi Сi.
9. Список спортсменiв школи
¦ ¦ ¦ Вид ¦ ¦ Участь у
N п/п ¦ Клас ¦ Прiзвище, iм'я учня ¦ спорту ¦ Розряд ¦ шкiльн.змаг.
-------+------+---------------------+--------+--------+--------------
Вiдсортувати список у алфавiтному порядку по прiзвищах учнiв.
10. Зведена вiдомiсть вiдправлення товарiв iз залiзничного складу
Шифр товару ¦ Станцiя призначення ¦ Дата вiдправлення ¦ Кiлькiсть
-------------+---------------------+-------------------+------------
Вивести дати вiдправлення товарiв, у шифрi яких є комбiнацiя "К6",
на ст. Львiв.

11. Лист передплати на перiодичнi видання
Видання
---------------T--------¦ К-сть мiс. ¦ П.I.П. ¦
Найменування ¦ Iндекс ¦ передплати ¦ передплатника ¦ Адреса
---------------+--------+------------+---------------+---------

Пересортувати список по зростанню iндексiв видань.

12. Список вокальних колективiв району
Найменування ¦ Дата реєстрацiї ¦ К-сть ¦ П.I.П. ¦ Участь в
колективу ¦ Мiсяць ¦ Рiк ¦ учасникiв ¦ керiвника ¦ обл.конкурсi
--------------+----------+-------+-----------+-----------+-------------

Вивести список колективiв, зареєстрованих у липнi-жовтнi 1994 року,
якi приймали участь в обласному конкурсi.

13. Медичний облiк дiтей, якi вiдвiдують дитячi ясла
Дитина ¦
-----------T---------+ Дата народження ¦ ¦ ¦ Наявнiсть
Прiзвище ¦ Iм'я ¦ рiк¦день¦мiсяць ¦ Зрiст ¦ Вага ¦ профiл.щеплень
-----------+---------+------+----+-------+-------+-------+---------------

Вивести список дiтей, яким на 1.06.94 виповнилось 3 роки, але вони не
пройшли профiлактичних щеплень.

14. Облiк автомобiлiв, що потребують ремонту
¦ Марка ¦ ¦ Дата проф.ремонту ¦ Вид
N п/п ¦ автомобiля ¦ Номер ¦ рiк мiсяць ¦ несправностi
------+--------------+---------+-------------------+-----------------
Надрукувати списки автомобiлiв, що проходили профiлактичний ремонт
протягом останнiх трьох мiсяцiв.
15. Розподiл путiвок у спортивно-оздоровчi табори по школах мiста
Найменування ¦ Мiсце ¦ ¦ Кiлькiсть ¦
табору ¦ знаходження ¦ N школи ¦ путiвок ¦Вiдповiдальний
----------------+-----------------+----------+-----------+--------------

Вивести список шкiл, що отримали путiвки в оздоровчий табiр "Сокiл"
в с. Брюховичi.