Контроль операцій введення-виведення
Спосіб контролю правильності операцій введення-виведення залежить від стану директиви контролю цих операцій. Директива має вигляд: {$І+} або {$І-}. За замовчуванням директива перебуває в активному стані {$І+}. У цьому режимі, якщо виникне помилка введення-виведення, робота програми переривається і користувач отримує повідомлення про номер та місцезнаходження помилки. Такий спосіб контролю незручний, бо може призвести до втрати даних.
Якщо директива {$І} перебуває в пасивному стані {$І-}, то за умови виникнення помилки введення-виведення виконання програми не припиняється, але наступні операції введення-виведення затримуються. Стан затримування зберігається доти, доки не буде викликана цілочислова функція IOResult. Ця функція повертає значення 0, якщо попередні операції введення-виведення були коректними, і деяке ненульове значення, якщо виявлені помилки. Після звертання до цієї функції значення її обнуляється. Хоча ця функція лише фіксує наявність чи відсутність помилок, контролюючи кожну операцію введення-виведення шляхом переведення директиви {$І} в пасивний стан тільки на момент виконання цієї операції, можна ідентифікувати причину виникнення помилки і передбачити програмні засоби для її усунення без переривання роботи програми і зі збереженням даних.
Текстові файли
Окреме місце в мові Паскаль займають текстові файли. На відміну від інших файлів, текстові файли не складаються з послідовності однакових елементів. Компонентами їх є рядки символів, що можуть мати довільну довжину. У кінці кожного рядка записується знак кінця рядка. У кінці файлу записується признак кінця файлу. Текстовий файл описується за допомогою стандартного ідентифікатора Техt. Наприклад,
Var f:Text.
Оскільки текстові файли не мають регулярної структури, то до них не можна застосовувати стандартні підпрограми FilePos, FileSize і Seek. Забороняється також одночасно читати і писати в один і той самий текстовий файл.
Процедури
Стандартні процедури Assign, Close, Reset, Rewrite мають ту саму дію. Процедури Read і Write модифіковані.
Read(Var f:Text;Var a1,…,an:anytype) – зчитує з файлу f значення і присвоює їх змінним із списку. Тип anytype може бути символьним, рядковим, цілим або дійсним. Дія і результат процедури Read залежать від типу величин, що зчитуються. Для параметра-змінної символьного типу з файлу буде зчитано символ і присвоєно відповідній змінній. Якщо до виконання процедури Read функція Eof набула значення Тruе, то символьній змінній буде присвоєно символ Chr($1А) (символ ^Z – кінець файлe), а якщо функція Eoln набула значення Тruе (в той-же час функція Eof набула значення False), то змінній буде присвоєно значення Сhr($0D) і Сhr($0A) (символ Сr – повернення каретки).
Для параметра-змінної рядкового типу процедура Read буде читати всі символи з одного рядка файлу до символу кінця рядка, але не включаючи його. Якщо довжина рядка перевищує довжину рядка-змінної, то зайві праві символи буде відкинуто.
Для параметра-змінної цілого типу чи деякого його піддіапазону процедура Read чекатиме надходження послідовності символів, які утворюють цілочислову константу. Пропуски, символи табуляції чи мітки кінця рядка, які передують числовій послідовності, пропускаються. Зчитування припиняється за умови зустрічі першого пропуску, знака табуляції чи мітки кінця рядка, що йдуть за числовою послідовністю, або за умови зустрічі мітки кінця файлу. Якщо числова послідовність не відповідає очікуваному формату цілого числа, то фіксується помилка введення-виведення.
Для параметра-змінної дійсного типу процедура Read чекатиме надходження послідовності символів, що утворюють константу дійсного типу. Пропуски, символи табуляції чи мітки кінця рядка, що передують числовій послідовності, пропускаються. Зчитування припиняється за умови зустрічі першого пропуску, знака табуляції чи, мітки кінця рядка, що йдуть за числовою послідовністю, або за умови зустрічі мітки кінця файлу. Якщо числова послідовність не відповідає очікуваному формату дійсного числа, то фіксується помилка введення-виведення.
Readln(Var f:Text; Var a1,…,an:anytype) – процедура, аналогічна процедурі Read, проте з тією відмінністю, що наступний оператор зчитування виконуватиметься з початку нового рядка, а символи, залишені в попередньому рядку, ігноруються. Виклик процедури Readln без списку параметрів-змінних приводить просто до переміщення вказівника файлу на початок наступного рядка. Таким чином оператор Readln(f,a,b) аналогічний складеному оператору;
begin Read(f,a);Read(f,b);Readln(f) end;.
Write(Var f:Text; Var a1,…,an:anytype) – записує у файл, який визначає f, одне або більше значень із списку змінних. Тип anytype може бути символьним, рядковим, цілим, логічним або дійсним. У процедурі Write допускається форматоване виведення аналогічно форматованому виведенню на екран. В даному випадку вільні знакомісця записуються у файл як пропуски.
Writeln(Var f:Text; Var a1,…,an:anytype) – процедура, аналогічна процедурі Write, але на відміну від неї після закінчення запису значень змінних із списку у файл записується мітка кінця рядка і наступний оператор виведення здійснюватиме запис даних з нового рядка. Виклик процедури Writeln без списку параметрів-змінних приводить до запису в файл порожнього рядка.
Слід зазначити, що стандартні системні файли (con, com1, lpt1 і т. д.) системою Turbo Pascal інтерпретуються як текстові і до них можна застосовувати процедури Readln і Writeln з тим самим змістом.
Наприклад, процедури Readln(Con) або Readln чекають натискування клавіші введення, процедура Writeln(Lst) виводить на друкуючий пристрій порожній рядок.
Функції
Eof(f:text):Boolean – аналогічна Eof для типізованих файлів.
Eoln(f:text):Boolean – функція набуває значення Тruе, якщо вказівник файлу міститься на мітці кінця рядка або на мітці кінця файлу, і False – в іншому випадку.
SeekEof(f:text):Boolean – функція, аналогічна функції Eof, але на відміну від неї ігнорує всі пропуски, символи табуляції і кінця рядка.
SeekEoln(f:text):Boolean – функція, аналогічна функції Eoln, але на відміну від неї ігнорує всі пропуски і символи табуляції.
Файли без типу
Система Turbo Pascal передбачає операції з файлами, які не мають типу. Ці файли сумісні з усіма типами файлів і призначені, як правило, для прямого доступу до файлу.
Опис безтипового файла складається з ключового слова File(наприклад: Var f:File; ). До файлів без типу можна застосовувати всі стандартні підпрограми, крім Read, Write і Flush. Вважають, що елементами файлів без типу є об’єкти довжиною 128 байтів. Під час використання процедури Seek вказівник файлу пересуватиметься по елементах такої довжини. Так, процедура Seek(f,2) помістить вказівник на третій елемент (байти з номерами 256..383). Операції зчитування і запису відбуваються лише порціями по 128 байтів. Це здійснюють процедури BlockRead і BlockWrite.
BlockRead(Var f:File; Var v:anytype; n:Integer; Var m:Integer) – процедура зчитує n блоків по 128 байтів з безтипового файла f. Результат вміщується в область оперативної пам’яті, яку займає змінна v (anytype – будь-який тип.). Необов’язковий параметр m показує, скільки блоків було фактично зчитано. Якщо m<n, то це означає, що в процесі зчитування файл закінчився.
BlockWrite(Var f:File; Var v:anytype; n:Integer; Var m:Integer) процедура записує n блоків по 128 байтів у безтиповий файл f. Дані, які записуються, беруться з області оперативної пам’яті, яку займає змінна v (anytype – будь-який тип). Необов’язковий параметр m показує скільки блоків було фактично записано. Якщо m<n то це означає, що з деякої причини не всі блоки були записані.
Зміст роботи
1. Вивчити теоретичний матеріал.
2. Виконати індивідуальне завдання.
3. Скласти звіт, в якому відповісти на теоретичні питання, описати алгоритм, описати програму, привести контрольний приклад виконання програми.
Індивідуальні завдання
Створити блок-схему та програму на мові Pascal для задачі згідно з індивідуальним завданням.
1.Створити файл, який містить інформацію про особисту колекцію книголюба. Структура запису: шифр книги, автор, рік видання, місцезнаходження (номер стелажу, шафи та т.і.). Кількість записів довільна.
2.Створити файл-довідник, який містить дані про біполярні транзистори. Структура запису: марка, провідність (n-p-n, p-n-p), максимальний струм колектора, максимальна напруга колектор-емітер, максимальна робоча частота. Кількість записів довільна.
3.Утворити файл, який містить інформацію про співробітників коледжу. Структура запису: прізвище працюючого, назва відділу, рік народження, стаж роботи, посада. Кількість записів довільна.
4.Утворити файл, який містить інформацію про пацієнтів дитячої клініки. Структура запису: прізвище пацієнта, стать, вік, місце проживання, діагноз. Кількість записів довільна.
5.Утворити файл, який містить інформацію про здачу студентами сесії. Структура запису: індекс групи, прізвище студента, оцінки з п`яти екзаменів та п`яти заліків (“З”–зараховано, “Н”– не зараховано). Кількість записів довільна.
6.Утворити файл, який містить інформацію про асортимент взуття в крамниці фірми. Структура запису: артикул, назва, кількість, ціна однієї пари. Кількість записів довільна. Артикул починається з літери Ж для жіночого взуття, Ч – чоловічого, Д – дитячого.
7.Створити файл-довідник, який містить дані про напівпровідникові діоди. Структура запису: марка, максимальний струм, максимальна зворотна напруга, падіння напруги у відкритому стані, максимальна робоча частота. Кількість записів довільна.
8.Створити файл, який містить інформацію про наявність квитків і рейсів Аерофлоту. Структура запису: номер рейсу, пункт призначення, час вильоту, час прибуття, кількість вільних місць у салоні. Кількість записів довільна.
9.Створити файл, який містить значення функції sin(x), cos(x), tg(x) коли x змінюється від 0 до 314 з кроком 0.5.
10.Написати програму яка створює файл, що містить інформацію про розклад телепрограм на день. Структура запису: назва програми, час початку програми, час закінчення програми.
Методичні РЕКОМЕНДАЦІЇ
1. Для виконання лабораторної роботи потрібно перш за все опрацювати теоретичний матеріал.
2. Виконати індивідуальне завдання.
3. Показати результат роботи викладачеві.
4. Скласти звіт, в якому відповісти на теоретичні питання, описати алгоритм, тобто створити блок-схему, описати програму (лістинг програми з коментарями), привести контрольний приклад виконання програми (результат роботи програми).
5. Здати робоче місце, а оформлений звіт – викладачеві на підпис.
6. Під час виконання лабораторної роботи дотримуватися правил безпеки.
Приклади програм
1.Створити програму для запису у файл асортименту товару в магазині. Структура запису: назва товару, кількість, ціна.
Блок - схема програми:
Лістинг програми:
Program myProgram;
uses crt;
type tov=record
nazva: string;
kilk: integer;
cina: real; end;
var f: file of tov; x: tov;
begin
Assign (f,'market.dat'); Rewrite (f);
repeat
writeln ('Vvedit informaziju pro tovar');
write ('Nazva:'); readln (x.nazva);
write ('Kilkist:'); readln (x.kilk);
write ('Cina:'); readln (x.cina);
write (f, x);
writeln ('Dlja vuxody natusnit [ESC]');
until readkey=#27; close (f); end.
Результат роботи програми:
2.Створити файл записів, який містить інформацію про комп'ютери: марку, обсяг вінчестера (hdd), обсяг оперативної пам'яті (ram) та швидкодію (speed). Вивести вміст файлу на екран.
Лістинг програми:
Program Computer1;
uses Crt;
type comp=record {Опишемо тип запису, який містить}
marka:string[15]; {характеристики комп'ютера}
hdd, ram:real; speed:integer;
end;
myfile=file of comp;
var f1:myfile; i,n:integer;
c1:comp;
begin
clrscr;
writeln ('Yvedit kilkist kompjyteriv'); readln(n);
assign(f1, 'd:\computer');
rewrite(f1); {Відкриємо f1 для записування в нього даних}
for i:= 1 to n do
begin
writeln('Yvedit marky kompjytera:');
readln(c1. marka);
writeln('Yvedit obsjahu joho HDD ta RAM:');
readln(c1.hdd, c1.ram);
writeln('Vvedit shvudkodijy:'); readln(c1.speed);
write(f1, c1); {Запишемо введені дані у файл f1}
end;
close(f1); {Закриємо файл f1}
writeln (' Marka Obsjah vin4estera RAM Shvudkodija');
reset(f1); {Відкриємо файл для зчитування даних}
for i:=1 to n do {Виведемо зміст файлу на екран}
begin
read(f1, c1); {Зчитаємо чергове дане з файлу}
writeln(c1.marka:15, c1.hdd:17, c1.ram:4, c1.speed:10);
end; readln; end.
Результат роботи програми:
Контрольні питання
1. Дайте визначення файлу.
2. Які операції введення-виведення використовуються при обробці файлів?
3. Що таке файл без типу?
4. Які існують процедури для обробки файлів без типу?
5. Які існують функції для обробки файлів без типу?
6. Дайте визначення текстового файлу.
7. Які існують процедури для обробки текстових файлів?
8. Які існують функції для обробки текстових файлів?
Викладач ____________ М. О. Пашко