Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_Pascal.rtf
Скачиваний:
11
Добавлен:
19.02.2016
Размер:
2.69 Mб
Скачать

Тема 8 Обробка файлів даних у програмах мовою Паскаль

Програмна модель файлу

З точки зору користувача файл являє собою сукупність однотипної інформації, що зберігається на диску під заданим ім’ям. Розмір файлу обмежений тільки фізичними можливостями пристрою (диску).

З точки зору програми мовою Паскаль файл може мати три іпостасі або бути поданим в трьох формах:

  1. типізований файл:

  2. нетипізований файл;

  3. текстовий файл.

Типізований файл – являє собою лінійну послідовність компонентів (елементів) одного типу і, як слідство цього, одного розміру (рис. 20). Всі компоненти файлу пронумеровані, починаючи з 0. Але це не означає, що файл організований аналогічно масиву. Нажаль, до компонентів файлу не можна звертатися за їх індексами. Наприкінці файлу встановлюється управляючий символ EOF (end of file) – ознака кінця файлу.

0

1

К

компонент 1

компонент 2

. . .

компонент К-1

EOF

файловий покажчик

Рис. 20. Модель типізованого файлу

В Паскаль-програмі розмір типізованого файлу вимірюється не в байтах, а в компонентах, тобто кількість компонентів файлу є його розміром.

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

Нетипізований файл – являє собою лінійну послідовність байтів. Для швидкісного зчитування даних з нетипізованого файлу до пам’яті та запису з пам’яті на диск нетипізований файл розбивається на блоки фіксованого розміру (рис.21). Бажано, щоб розмір блоку був 128, 256, 512 і т.д. байтів (це обумовлено фізичною організацією дискового простору). Переваги використання нетипізованого файлу відчутні при роботі з великими масивами даних, тому що існує можливість перенесення інформації не по окремих елементах, а блоками (гуртово).

байти

EOF

блок 1

блок 2

. . .

блок N

Рис. 21. Модель нетипізованого файлу

Текстовий файл – являє собою послідовність символів. Текстовий фал може бути розбитий на рядки ( EOLN (end of line) – ознака кінця рядка). Наприкінці файлу знаходиться ознака EOF (рис. 22).

рядок символів

EOLN

рядок символів

EOLN

рядок символів

EOF

Рис. 22. Модель текстового файлу

Файли прямого та послідовного доступу

Файли за порядком доступу до своїх компонентів розподіляють ся на файли прямого та послідовного доступу.

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

Файли послідовного доступу – це файли, для яких при зчитуванні або записі компонента необхідно спочатку прочитати всі передуючі компоненти, щоб отримати доступ до необхідного.

Типізовані та нетипізовані файли – це файли прямого доступу. Текстові файли – це файли послідовного доступу.

Обробка файлів у програмі мовою Паскаль

У програмах файли використовуються для постійного збереження даних. Для того щоб у програмі здійснити звернення до файлу необхідно:

  1. Оголошення файлової змінної

Файлова змінна ( ФЗ ) – це спеціалізована змінна програми для доступу до файлів.

Відповідно до типу файлу файлова змінна може бути одного з трьох типів:

  • типізована файлова змінна оголошується:

< ідентифікатор ФЗ> : file of <тип компонентів файлу> ;

Наприклад:

Var

F:file of integer; {ФЗ для доступу до файлу з цілими числами}

G:file of real; {ФЗ для доступу до файлу з дійсними числами}

  • нетипізована файлова змінна:

< ідентифікатор ФЗ> : file ;

Наприклад:

Var

H:file; {нетипізована ФЗ}

  • текстова файлова змінна

< ідентифікатор ФЗ> : text ;

Наприклад:

Var

J:text; {ФЗ для доступу до текстового файлу}

  1. Зв’язування файлової змінну з файлом на диску

Ця операція виконується за допомогою процедури:

Assign (<ФЗ>, <ім’я файлу>);

<ФЗ> – файлова змінна будь-якого типу;

<ім’я файлу> - повне ім’я файлу, що включає ім’я диску, список каталогів та безпосередньо ім’я файлу з розширенням. Ім’я файлу – це послідовність символів, тобто змінна типу string або рядкова константа. Наприклад:

Assign(f, ‘c:\MyDir\myfile.dat’);

В наведеному прикладі файлова змінна f зв’язується з фаайлом, що розташований на диску c: в каталозі MyDir. Ім’я файлу – myfile, розширення dat.

Після установки зв’язку файл необхідно відкрити.

  1. Відкриття файлу

Для того щоб отримати доступ до компонентів файлу, його необхідно відкрити.

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

Відкриття типізованого файлу

Відкриття вже існуючого типізованого файлу здійснюються за допомогою процедури:

Reset (<ФЗ>);

де < ФЗ > - файлова змінна.

При відкритті типізованого файлу командою Reset припустиме виконання операцій зчитування та запису компонентів файлу.

Після відкриття файлу файловий покажчик встановлюються на нульовий компонент файлу.

Відкриття нового типізованого файлу здійснюється процедурою:

Rewrite (<ФЗ>);

яка відкриваю типізований файл для запису в нього інформації.

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

Відкриття нетипізованого файлу

Відкриття вже існуючого нетипізованого файлу для зчитування здійснюються за допомогою процедури:

Reset (<ФЗ>, Size);

де < ФЗ > - файлова змінна, Size – розмір блоку у байтах.

Відкриття нового нетипізованого файлу для запису:

Rewrite (<ФЗ>, Size);

Другий параметр Size в цих процедурах не є обов’язковим. Якщо його не вказано, то вважається, що розмір блоку по замовчанню 128 байтів.

Відкриття текстового файлу

Відкриття текстового файлу здійснюється також як і відкриття типізованого файлу, але для текстового файлу процедура Reset відкриває файл тільки для зчитування, а Rewrite – тільки для запису. Крім того для текстових файлів застосовується ще процедура

Append(< ФЗ >);

яка відкриває вже існуючий текстовий файл для запису в кінець цього файлу (файловий покажчик при цьому встановлюється на кінець файлу).

  1. Доступ до елементів файлу

Стандартні процедури і функції для файлів всіх типів

Еоf (<ФЗ>) : boolean

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

Дуже зручно використовувати цю функцію при організації циклічного зчитування з файлу. Розглянемо приклад: заданий файл ‘c:\myfile.dat’, що містить непусту послідовність цілих чисел. Обрахувати суму цих чисел.

var

F: file of integer; {файл цілих чисел}

S: longint; {накопичувач суми}

x:integer; {проміжна змінна для зчитування компонентів файлу}

begin

{відкриття файлу для зчитування}

Assign (F, ‘c:\myfile.dat’);

Reset(F);

S:=0;

while not EOF (F) do

begin

read(F, x);

S:=S+x;

end;

Close (F); {закриття файлу}

Writeln (‘S=’, S:10);

end.

В наведеному прикладі на початку програми файлова змінна зв’язується з вказаним у задачі файлом на диску, який відкривається для зчитування. Тіло циклу while буде повторюватися доки не буде досягнуто кінець файлу. У циклі з файлу послідовно зчитується по одному компоненту та додаються до суми. По завершенні циклу значення суми виводиться на екран.

Стандартні процедури і функції для файлів прямого доступу

Seek(< ФЗ >, N )

Процедура переміщує файловий покажчик з поточної позиції на вказану компоненту з номером N (значення N типу longint).

Filepos (< ФЗ >) :longint

Функція повертає номер компоненту файлу, на який встановлений файловий покажчик.

Filesize (< ФЗ >) :longint

Функція повертає розмір файлу, що вимірюється не в байтах, а в компонентах (кількість компонент).

IOResult(< ФЗ >): integer

функція повертає номер помилки, яка виникла при звернені до файлу. Якщо помилок не було, то повертається 0.

Цю функцію зручно використовувати для “тихої” обробки помилок, які можуть виникнути при роботі з файлом. Під тихою обробкою розуміється, що користувач програми не буде отримувати системне повідомлення про помилку, яка може бути усунута самою програмою (якщо не усунута, то з обійдена з найменшими втратами для честі і гідності програміста).

Для того щоб відключити видачу стандартного повідомлення про помилку необхідно дати директиву компілятору {$I-}. Якщо на початку в тексті програми задати цю директиву, то під час виконання не будуть видаватися повідомлення про помилку.

Для того щоб все повернути назад у програмі треба вказати директиву {$I+}.

Стандартні процедури і функції для текстових файлів

ЕOLN (<ФЗ>) : boolean

Функція повертає значення true, якщо досягнутий кінець рядка (або кінець файлу) або false у протилежному випадку.

SeekEOLN (<ФЗ>);

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

SeekEOF (<ФЗ>);

Пересуває файловий покажчик на кінець файлу.

Стандартні процедури і функції зчитування/ запису даних

Для зчитування і запису даних у типізованих та текстовий файлів використовується процедури Read та Write.

Read (< ФЗ >, < список введення > );

Write (< ФЗ >, < список виведення > );

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

Для текстових файлів можливо використання процедур

ReadLn (< ФЗ >, < список введення > );

WriteLn (< ФЗ >, < список виведення > );

при використанні яких з файлу відбувається по-рядкове зчитування (при зчитуванні з файлу береться послідовність символів, що починається з поточної позиції файлового покажчика та закінчується ознакою EOLN) або запис (при записі після виведення останньої змінної до файлу додається ознака EOLN).

Особливості використання текстового файлу

Як вже було сказано вище текстовий файл містить набір рядків символів. Здавалось би, що це накладає певні обмеження на тип інформації, що передається з файлу та в файл (тобто передаються тільки рядки символів). Але для текстового файлу такого обмеження не існує!

При виконанні операцій зчитування та запису текстового файлу дозволяється передача даних чисельних і нечисельних типів без попередньої конвертації (перетворення) у рядок. Таке перетворення відбувається автоматично при передачі даних.

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

Розглянемо приклад: скласти програму для обчислення

,

де a, b – цілі, x – дійсне зберігаються у файлі.

Враховуючи те, що з файлу необхідно прочитати дані різних типів, типізований файл використовувати неможна. Крім того цілочисельні та дійсні змінні мають різний розмір, що ускладнює використання нетипізованого файлу (неможна призначити блок одного розміру). Найпростішим та найзручнішим у цьому випадку буде використання текстового файлу.

Var

a, b: integer;

y, x: real;

f: text;

begin

{відкриття файлу}

Assign (f, ‘c:\datafile.dat’);

Reset (f);

{зчитування змінних}

Read (f, a, b, x);

y:=srt ( abs(a+b*x) );

WriteLn(‘y=’, y:9:4);

Close (f);

end.

При зчитуванні вважається, що файл містить всю необхідну інформацію, яка подана у форматі, що відповідає типу заданих змінних, тобто для правильного виконання процедури Read (f, a, b, x) у файлі f записані два цілочисельних значення (для змінних a і b) та одне дійсне для змінної x. Ці значення вказуються у файлі через прогалину. Наприклад, якщо файл містить таку послідовність:

5 5 4.0

то змінна а дорівнюватиме 5, b теж дорівнюватиме 5, а х=4.0. Тоді значення у буде 5.0.

Для нетипізованих файлів використовуються процедури:

BlockRead (< ФЗ >, Buf, N, Result);

яка зчитує з файлу, з яким пов’язана файлова змінна < ФЗ > N блоків і записує їх в змінну Buf. Вважається, що змінна Buf достатня за розміром і у файлі вистачить даних. Змінна Result не є обов’язковим параметром. Якщо вона використовується, то повертає кількість реально зчитаних блоків. Після виконання операції зчитування файловий покажчик пересувається на відповідну кількість блоків.

Для запису даних у нетипізований файл використовується процедура:

BlockWrite (< ФЗ >, Buf, N, Result);

яка записує в файл, з яким пов’язана файлова змінна < ФЗ > N блоків зі змінної Buf. Змінна Result також не є обов’язковим параметром. Якщо вона використовується, то повертає кількість реально зчитаних блоків.

Розглянемо приклад: зчитати з нетипізованого файлу ‘c:\DataFile.dat’ цілочисельні дані для масиву А(100). Звести елементи масиву в квадрат та записати знову до файлу.

Var

F: file;

A: array [1..100] of integer;

i: byte;

begin

{зв’язування файлу з ФЗ}

Assign (F, ‘c:\DataFile.dat’);

{відкриття файлу для зчитування}

Reset (F, SizeOf(A));

{зчитування даних з файлу до масиву А}

BlockRead (F, A, 1);

Close (F); {закриття файлу}

{обробка елементів масиву}

for i:=1 to 100 do

A[i]:=sqr(A[i]);

{відкриття файлу для запису}

Rewrite(F, SizeOf(A));

{запис даних з масиву А до файлу}

BlockWrite(F, A, 1);

Close(F); {закриття файлу}

end.

На початку програми нетипізований фай відкривається для зчитування (дивися розд. “Відкриття нетипізованого файлу”). Другим параметром процедури Reset є розмір блока файла. Для зручності розмір блока файла призначається рівним розміру масиву А.

Функція SizeOf (Х) повертає розмір заданого аргументу Х, яким може бути будь-яка змінна або тип даних.

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

  1. Закриття файлу

Після закінчення роботи необхідно закрити файл процедурою:

close (<ФЗ>);

Якщо файл не закрити, то можна втратити інформацію, особливо якщо проводився запис даних у файл.

Після закриття файлу, у разі необхідності, файлова змінна може бути зв’язана з іншим файлом.

Зовнішні пристрої і стандартні текстові файли

Зовнішні пристрої операційної системи такі як клавіатура, дисплей, принтер, послідовні та паралельні порти можуть бути описані та використані у програмі як файли зі стандартними іменами:

CON – стандартний текстовий файл консолі. В залежності від напряму передачі даних пов’язаний з клавіатурою або екраном;

PRN – стандартний файл принтера;

LPT1, LPT2 – стандартні файли паралельних портів;

COM1, COM2– стандартні файли послідовних портів;

AUX – синонім СОМ1;

NUL – неіснуючий пристрій.

Крім цього для введення та виведення можуть використовуватися стандартні текстові файли:

Input – стандартний текстовий файл, що пов’язаний з буфером клавіатури;

Output – стандартний текстовий файл, що пов’язаний з буфером виведення на екран;

Контрольні запитання за темою

  1. Що таке файл? Коли доцільно зберігати у файл дані з програми?

  2. Форми подання файлу у Паскаль - програмі? Що таке типізований, нетипізований та текстовий файл?

  3. Моделі типізованого, нетипізованого та текстового файлу як лінійної послідовності компонентів?

  4. Для чого потрібна у програмі файлова змінна? Типи файлових змінних. Наведіть приклади їх оголошення.

  5. Організація доступу до файлу з програм мовою Паскаль. Призначення процедур Assign, Reset, Rewrite, Append, Close.

  6. Процедури і функції роботи з типізованим файлами FilePos, FileSize, Seek, EOF.

  7. Як здійснюється файлове введення \ виведення даних з типізованого та нетипізованого файлу?

  8. Особливості структури текстового файлу. Процедури і функції роботи з текстовими файлами. Чи можна у текстовий файл записати чисельні значення? Наведіть приклади.

  9. Стандартні текстові файли введення \ виведення Input та Output.

  10. Як здійснюється доступ до портів з програми мовою Паскаль?