Головна > Файли, типізовані та текстові файли в Turbo Pascal

Файли

Введення файлового типу в мову Паскаль викликано необхідністю забезпечити можливість роботи з периферійними (зовнішніми) пристроями ЕОМ, призначеними для введення, виведення і зберігання даних.

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

Поняття файлу досить широке. Це може бути звичайний файл на диску, комунікаційний порт ЕОМ, пристрій друку, клавіатура або інші пристрої.

При роботі з файлами виконуються операції введення - виведення. Операція введення означає перепис даних із зовнішнього пристрою (із вхідного файлу) в основну пам'ять ЕОМ, операція виведення - це пересилання даних з основної пам'яті на зовнішній пристрій (у вихідний файл).

Файли на зовнішніх пристроях часто називають фізичними файлами. Їхні імена визначаються операційною системою. У програмах мовою Паскаль імена файлів задаються за допомогою рядків. Наприклад, ім'я файлу на диску може мати вигляд:

'LAB1.DAT'
'c:\ABC150\pr.txt'
'my_files'
				

Типи файлів Турбо Паскаль

Турбо Паскаль підтримує три файлових типи:

  • текстові файли;
  • типізовані файли;
  • нетипізовані файли.

Доступ до файлу в програмі відбувається за допомогою змінних файлового типу. Змінну файлового типу описують одним з трьох способів:

file of тип - типізований файл (вказаний тип компоненти);
text - текстовий файл;
file - нетипізований файл.

Приклади опису файлових змінних:

var
   f1: file of char;
   f2: file of integer;
   f3: file;
   t: text;
				

Стандартні процедури та функції

Будь-які дискові файли стають доступними програмі після зв'язування їх з файловою змінною, оголошеної в програмі. Всі операції в програмі здійснюються тільки за допомогою пов'язаної з ним файлової змінної.

Assign(f, FileName)

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

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

Reset(f)

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

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

Rewrite(f)

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

Close(f)

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

EOF(f): boolean

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

Rename(f, NewName)

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

Erase(f)

видаляє фізичний файл на диску, який був зв'язаний з файловою змінною f. Файл до моменту виклику процедури Erase має бути закритий.

IOResult

повертає ціле число, яке відповідає коду останньої помилки введення - виведення. При нормальному завершенні операції функція поверне значення 0. Значення функції IOResult необхідно надавати якій-небудь змінній, так як при кожному виклику функція обнуляє своє значення. Функція IOResult працює тільки при вимкнутому режимі перевірок помилок введення - виведення або з ключем компіляції {$I-}.

Робота з типізований файлами

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

Запис у файл:

Write(f, список змінних);

Процедура записує у файл f всю інформацію зі списку змінних.

Читання з файлу:

Read(f, список змінних);

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

Зсув покажчика файлу:

Seek(f, n);

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

Визначення кількості компонент:

FileSize(f): longint;

Функція повертає кількість компонент у файлі f.

Визначення позиції покажчика:

FilePos(f): longint;

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

Відсікання останніх компонент файлу:

Truncate(f);

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

Робота з текстовими файлами

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

Читання з текстового файлу:

Read(f, список змінних);
ReadLn(f, список змінних);

Процедури зчитують інформацію з файлу f в змінні. Спосіб читання залежить від типу змінних, що стоять в списку. У змінну char записуються символи з файлу. Запис у числову змінну відбувається за таким принципом: пропускаються символи-роздільники, початкові пробіли і зчитується значення числа до появи наступного роздільника. У змінну типу string записується кількість символів, яка дорівнює довжині рядка, але тільки в тому випадку, якщо до цього не зустрілися символи кінця рядка або кінця файлу. Відмінність ReadLn від Read полягає в тому, що перша команда після прочитання даних пропустить решту символів рядку, включаючи мітку кінця рядка. Якщо список змінних відсутній, то процедура ReadLn(f) пропускає рядок при читанні текстового файлу.

Запис в текстовий файл:

Write(f, список змінних);
WriteLn(f, список змінних);

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

Додавання інформації до кінця файлу:

Append(f)

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

Робота з нетипізованими файлами

Нетипізовані файли - це послідовність компонент довільного типу.

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

Reset(f, BufSize)
Rewrite(f, BufSize)

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

Читання даних з нетипізований файлу:

BlockRead(f, X, Count, QuantBlock);

Ця процедура здійснює за одне звертання зчитування в змінну X такої кількості блоків, яка задана параметром Count, при цьому довжина блоку дорівнює довжині буфера. Значення Count не може бути менше 1. За одне звернення не можна прочитати більше, ніж 64 Кбайт.

Необов'язковий параметр QuantBlock повертає число блоків, прочитаних поточною операцією BlockRead. У разі успішного завершення операції читання QuantBlock = Count, у разі аварійної ситуації параметр QuantBlock буде містити число вдало прочитаних блоків. Звідси випливає, що за допомогою параметра QuantBlock можна контролювати правильність виконання операції читання.

Запис даних у нетипізований файл:

BlockWrite(f, X, Count, QuantBlock);

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

Необов'язковий параметр QuantBlock повертає число блоків, записаних успішно поточною операцією BlockWrite.

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

У вас є питання? Щось не розумієте? Будемо раді вас бачити на українському форумі програмістів.