Тема: Програмування. Основні етапи розробки прикладних програм

Вид материалаДокументы

Содержание


Тема: файли
Тому виникає потреба в організації даних таким чином, щоб і розмір і час існування їх були як завгодно великими. Це стало можлив
Filepos (
While not eof (
Block write (var : file; var buffer; : longint; var : longint)
Rename (var ; )
Подобный материал:
1   2   3   4   5   6   7   8   9   ...   14
ТЕМА: ФАЙЛИ

Файлові змінні

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

Наприклад

Для бази даних про студентів з попереднього прикладу можна використати масив, розмір якого k визначається із співвідношення k*321<=65530, k<=204.

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

Файли – пойменовані ділянки пам’яті, які містять деякі дані.

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

В програмі файли представляються спеціальними змінними – файловими. Ця змінна є свого роду буфером між конкретним файлом на диску, з яким вона зв’язана, і програмою.

Одна і та ж змінна може бути зв’язана із різними файлами, але не одночасно.

В залежності від способу структурування даних в Pascal відрізняють три види файлів і файлових змінних:
  1. Типізовані.
  2. Текстові.
  3. Безтипові.

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

Наприклад

Файл дійсних чисел є послідовністю елементів із шести байт, що відповідають дійсним числам.

Файл цілих чисел – послідовність двобайтових чисел.

Файл записів – послідовність структур, що відповідають певному комбінованому типу. Наприклад 321 байт.

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

Текстові файли можна вважати файлами ASCII-форматами. Особливістю є те, що послідовність розбивається на рядки спеціальними комбінаціями символів (end, old, line).

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

Встановлюючи та завершальні операції над файлами

Перед використанням операції над файлом, він повинен бути відкритим.

Читання, запис, до запис в кінець

Після завершення операції із файлом для звільнення для файлової змінної його потрібно закрити.

Вид та тип файла визначається типом файлової змінної, що представляє файл.

Типізовані файлові змінні

VAR

<файлова змінна>: FILE OF <тип>;

Наприклад

Var

f1: file of integer;

f2: file of real;

f3: file of student;

Текстові файлові змінні оголошуються в розділі var при допомозі text.

VAR

<файлова змінна1> ,<файлова змінна2>…: TEXT;

Безтипові файлові змінні оголошуються в розділі var при допомозі file.

VAR

<файлова змінна1>,<файлова змінна2>,…:FILE;

Для роботи із файлами використовуються наступні встановлюючи та завершальні процедури.
  1. Процедура зв’язування певної файлової змінної із конкретним файлом на диску

ASSIGN (<файлова змінна>,’<ім'я файла>’);

Файлова змінна по замовлюванню вважається без типовою.

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

Тип фактичної файлової змінної, що використовується в процедурі assign означає вид і тип файлу.

Наприклад

Var

f1: file of real;

f2: text;

f3: file;

begin

assign(f1, ‘file1.dat’);

assign(f2, ‘file2.dat’);

assign(f3, ‘file3.dat’);
  1. Процедура відкриття файлу для читання

RESET(<файлова змінна>);

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

REWRITE(<файлова змінна>);

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

CLOSE(<файлова змінна>);

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

Закриття файлу при запису призводить до фізичного запису файлу на диск.

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

FLUSH (<файлова змінна>);

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

Спеціальні підпрограми для роботи з типізованими файлами

Відкриваються і закриваються всі види файлів однаково.

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

Типізовані файли умовно є послідовністю елементів деякого базового типу.

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

Для роботи з типізованими файлами використовують такі процедури і функції.
  1. Розглянуті раніше встановлюючи та завершальні підпрограми
  2. Процедура читання

READ (<файлова змінна>,<список параметрів вводу>);

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

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

WRITE (<файлова змінна>,<список параметрів виводу>);

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

Якщо файл відкритий для запису, то всі дані стираються і запис виконується спочатку. Якщо ж файл відкритий для читання, то всі дані залишаються і файл відкривається для модифікації. Це має місце лише для типізованих файлів. Список параметрів виводу складається із довільної кількості змінних або констант, тип яких співпадає із типом файлу. Виконання процедури запису переміщує файловий вказівник на відповідну кількість записів, причому або дані перезаписуються поверх старих або доповнюються в кінець, причому елемент eof посувається.

Наприклад

Var

f: file of integer;

x, y, z: integer;



assign(f, ‘file int.dat’);

reset(f);

x:=3; y:=4; z:=5;

write(f,x,y,z);
  1. Функція визначення розміру файла у записі

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

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

FILESIZE(<файлова змінна>);

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

Наприклад

Var

f1: file of integer;

f2:file of real;

x, y:longint;

assign(f1, ‘file.dat’);

reset(f1);

x:=filesize(f1);

close(f1);

assign(f2, ‘file.dat’);

reset(f2);

y:=filesize(f2);

close(f2);
  1. функція визначення позиції файлового вказівника

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

FILEPOS (<файлова змінна>);
  1. Процедура встановлення файлового вказівника в задану позицію

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

SEEK (<файлова змінна>;<номер позиції>);

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

EOF(<файлова змінна>);

Результат true, якщо eof в кінці файлу і false – якщо на будь-якій іншій позиції.

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

WHILE NOT EOF (<файлова змінна>) DO
  1. Функція встановлення файлового вказівника в кінець файлу

SEEKEOF(<файлова змінна>);

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

Наприклад


Створити типізований файл цілих чисел, відкрити його для читання і знайти суму кожного п’ятого елементу.

Var

f: file of integer;

i, j, x: integer;

begin

assign(f, ‘file.dat’);

rewrite(f);

for i:=1 to 20 do

begin

readln(x);

write(f,x);

end;

close (f);

reset(f);

j:=0; x:=0;

while not eof (f) do

begin

read(f,i);

x:=x+i; j:=j+5;

if filesize (f) <=j then

seekeof(f) else seek (f,j);

end;

close(f);

writeln(x);

end.
  1. Процедура відсікання хвостової частини файлу

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

TRUNCATE(<файлова змінна>);

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

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

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

Наприклад

For i:=1 to m do

Begin

Seek (f, n+m+i-1);

Read(f,x);

Seek(f, n+i-1);

Write(f,x)

End;

Truncate(f);

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

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

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

Текстові файли на диску нічим не відрізняються від інших файлів. Всі дискові файли

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

Текстові файли – це послідовність елементів, але, на відмінну від типізованого файлу file of char, в текстових файлах деякі елементи мають своє спеціальне призначення. Це спеціальні комбінації символів #13 #10, які утворюють ознаку кінця рядка. Ця ознака займає 2 байти, але не є текстовою інформацією.

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

Наприклад

Assign(f, ‘text.txt’);

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

Зауваження На відмінну від типізованих reset(f) відкриває лише для читання, rewrite(f) – тільки для запису.
  1. Процедура читання з текстового файлу

READ(<файлова змінна>,<список параметрів>);

READLN(<файлова змінна>,<список параметрів>);

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

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

Процедура read читає дані із текстового файлу і не переміщує файловий вказівник на новий рядок, якщо не досягнута ознака eof.

Readln читає і в будь-якому випадку переміщує файловий вказівник на новий рядок.

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

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

WRITE(<файлова змінна>,<список параметрів>);

WRITELN(<файлова змінна>,<список параметрів>);

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

В якості параметрів можуть бути змінні стандартних скалярних типів або рядкового типу величини

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

Процедура write здійснює запис у файл без введення ознаки кінця рядка., а процедура writeln після запису всіх параметрів допускає ознаку eof, тобто
  1. Функція ознаки кінця рядка

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

SEEKEOLN(<файлова змінна>);

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

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

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

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

APPEND(<файлова змінна>);

При її виконанні файловий вказівник поміщається вкінець файлу. До запис можливий лише в кінці. Перемістити файловий вказівник на початок файлу неможливо.

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

Безтипові файли

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

Такі файли переважно застосовуються для швидкого перенесення даних з одного файла в інший без інтерпретації їх певним типом. Це може бути звичайне копіювання одного досить великого файла в інший. Для без типових файлів файлові змінні оголошуються при допомозі службового слова file.

Процедури reset та rewrite можуть мати певну відмінність. Це пов’язано з тим, що читання і запис у без типових файлах здійснюється блоками байтів певного розміру. Розмір блока задається в якості другого параметру процедур reset та rewrite відповідно:

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

За одну операцію читання-запису можна зчитати, записати декілька блоків.

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

Можна прочитати до 19 блоків. Для читання (запису) використовуються свої процедури

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

Кількість блоків, що читається задається

N – повертає реальну кількість прочитаних блоків.

BLOCK WRITE (VAR : FILE; VAR BUFFER; : LONGINT; VAR : LONGINT);

Записує у безтиповий представлений файловою змінною задану кількість k –блоків визначеного розміру із змінної buffer. Реальну кількість записуваних блоків повертає N.

Наприклад

Скопіювати дані з одного файлу в інший.

Var

f1, f2: file;

buffer: array[1..1000] of byte;

k, n: integer;

begin

assign(f1, ‘file1.dat’);

assign(f2, ‘file2.dat’);

reset(f1,100);

rewrite(f2,10);

while not eof (f1) do

begin

blockread (f1, buffer, 1, k);

blockwrite (f2, buffer, 10, n);

end;

close (f1); close(f2);

end.

Використання без типових файлів дозволяє виконувати ряд дій, пов’язаних з командними операційної системи.

Окремі ОС команди реалізуються простими викликами стандартних процедур.

З програми можна перейменовувати файли, копіювання, виділення.

1. Процедура для перейменування файлів

RENAME (VAR ; );

2. Процедура видалення файлу

ERASE();

ІІ- семестр