Міністерство освіти і науки України
НУ „Львівська політехніка”
Кафедра __________
ЗВІТ
Про виконання лабораторної роботи №.....
На тему:________________________________________________________________
________________________________________________________________________
________________________________________________________________________
___________________
(Студент)
___________________
(Група)
___________________
(Керівник лаб. Занятть)
------Львів 200…------
Л а б о р а т о р н а р о б о т а 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.
Завдання для роботи Лист передплати на перiодичнi видання Видання
+——————————————+————————+—К-сть мiс.—+———П.I.П.——————+————————+
| Найменування | Iндекс | передплати | передплатника | Адреса |
+——————————————+————————+————————————+———————————————+————————+
Впорядкувати його по зростанню індекса
PROGRAM Accounting;
USES crt;
TYPE account=record
Title :string [15];
Index :integer;
Quantity :String [5];
Name :String [15];
Address :string [15];
end;
VAR
A :array [1..50] of account;
Temp :Account;
f_a :File of account;
t :Text;
Filetext, Filename:string;
i,j,k,min:integer;
BEGIN
clrscr;
Filetext := 'C:\File.txt';
Filename := 'C:\File1.txt';
assign(t, filetext);
assign(f_a,filename);
Rewrite (f_a);
reset (t);
k:=0;
While (not eof(t)) do
begin
Readln(t,A[i].title);
Readln(t,A[i].index) ;
Readln(t,A[i].quantity);
Readln(t,A[i].Name);
Readln(t,A[i].address);
k:=k+1;
end;
min:=A[1].index;
For i:=1 to k do
For j:=1 to k do
With a[i] do
if A[j].index<min then
begin
temp:=A[i];
A[i]:=A[j];
A[j]:=temp;
end;
Reset(f_a);
For i:=1 to k do
With A[i] do
Begin
write(f_a, a[i]);
End;
Readln;
end.