Лабораторна робота № 11
(модуль 2)
Тема: Робота з файлами. Двійкові файли. (2 години)
Мета: Ознайомити з поняттям двійкового файлу. Формувати вміння і навички обробки двійкових файлів мови програмування Pascal.
Література:
Архангельский А.Я. Язык Pascal и основы программирования в Delphi
Ахо А., Хопкрофт Дж., Ульман Дж. Построение и анализ вычислительных алгоритмов.– М.: Мир, 1979.– 536 с.
Культин Н.Б. Turbo Pascal в задачах и примерах
М.С.Львов, О.В. Співаковський. Основи алгоритмізації та програмування.
Марченко А.И., Марченко Л.А. Программирование в среде Turbo Pascal 7.0
Меженный О.А. Turbo Pascal
Н.Вирт. Алгоритмы + структуры данных = программы. Москва, Мир, 1985 г. 406 с.
Н.Вирт. Алгоритмы и структуры данных. Москва, Мир, 1989 г. 420 с.
Немцова Т.И., Голова С.Ю., Абрамова И.В. Программирование на языке высокого уровня. программирование на языке Object Pascal
Окулов С.М. Основы программирования.– М.: ЮНИМЕДИАСТАЙЛ, 2002.– 424 с.
Павловская Т.А. Паскаль. Программирование на языке высокого уровня
Пильщиков В.Н. Сборник упражнений по языку Паскаль. Москва, Наука, 1989 г., 160 с.
Фаронов В.В. Turbo Pascal 7.0. Начальный курс. – Учебное пособие. – М.: Издательство «ОМД Групп», 2003 г. -616 с.
Фаронов В.В. Turbo Pascal 7.0. Практика программирования
Фаронов В.В. Turbo Pascal 7.0. Учебный курс
Короткі теоретичні відомості.
Бінарні (двійкові) файли зберігають інформацію в тому вигляді, в якому вона представлена в пам'яті комп'ютера, і тому незручні для людини. Заглянувши в такий файл, неможливо зрозуміти, що в нім записане; його не можна створювати або виправляти вручну - в якому-небудь текстовому редакторові - і тому подібне. Проте всі ці незручності компенсуються швидкістю роботи з даними.
Крім того, текстові файли відносяться до структур послідовного доступу, а бінарні - прямого. Це означає, що у будь-який момент часу можна звернутися до будь-якого, а не тільки до поточного елементу бінарного файлу.
Змінні структурованих типів даних (окрім строкового) неможливо рахувати з текстового файлу.
Вихід з цієї ситуації пропонують файли, що типізуються, - їх елементи можуть відноситися до будь-якого базового або структурованого типу даних. Єдине обмеження: всі елементи мають бути одного і того ж типу. Це незручність, що здається, є неодмінною умовою для організації прямого доступу до елементів бінарного файлу: як і у разі масивів, якщо точно відома довжина кожного компоненту структури, то адреса будь-якого компоненту може бути обчислений по дуже простий формулі:
<початок_структури> + <номер_компоненту>*<довжина_компоненту>
У розділі var файлові змінні, призначені для роботи з файлами, що типізуються, описуються таким чином:
var <файлова_змінна>: file of <тип_елементіві_файлу>;
Ніяка файлова змінна не може бути задана константою.
Команда assign(f,'<ім’я_файлу>'); служить для встановлення зв'язку між файловою змінною f і ім'ям того файлу, за роботу з яким ця змінна відповідатиме.
Рядок '<ім’я_файлу>' може містити повний шлях до файлу. Якщо шлях не вказаний, файл вважається за розташований в тій же директорії, що і виконуваний модуль програми.
Залежно від того, які дії ваша програма збирається проводити з файлом, що відкривається, можливе двояке його відкриття:
reset(f); - відкриття файлу для читання з нього інформації і одночасно для запису в нього (якщо такого файлу не існує, спроба відкриття викличе помилку). Ця ж команда служить для повернення покажчика на початок файлу;
rewrite(f); - відкриття файлу для запису в нього інформації; якщо такого файлу не існує, він буде створений; якщо файл з таким ім'ям вже є, що вся містилася в ньому раніше інформація зникне.
Закриваються файли, що типізуються, процедурою close(f), загальною для всіх типів файлів.
Читання з файлу, відкритого для читання, проводиться за допомогою команди read(). У дужках спочатку указується ім'я файлової змінної, а потім - список введення:
read(f,a,b,c); - читати з файлу f три однотипні змінні а, b і с.
Вводити з файлу можна тільки змінні відповідного оголошенню типу, але цей тип даних може бути і структурованим.
type toy = record name: string[20];
price: real;
age: set of 0..18; {задано межами}
end;
var f: file of toy;
а: array[1..100] of toy;
begin
assign(f,input);
reset(f);
for i:=1 to 100 do
if not eof(f) then read(f,a[i]);
close(f);
...
end.
Вже знайома нам функція eof(f:file):boolean повідомляє про досягнутий кінець файлу. Решта всіх функцій "пошуку кінця" (eoln(), seekeof() і seekeoln()), властивих текстовим файлам, не можна застосовувати до типізованих файлів.
Проте існують спеціальні підпрограми, які дозволяють працювати з файлами, що типізуються, як із структурами прямого доступу:
Функція filepos(f:file):longint повідомить поточне положення покажчика у файлі f. Якщо він указує на сам кінець файлу, то ця функція видасть результат N. Це легко з'ясовно: елементи файлу нумеруються починаючи з нуля, тому останній елемент має номер N-1. А номер N належить, таким чином, "неіснуючому" елементу - ознаці кінця файлу.
Функція filesize(f:file):longint обчислить довжину файлу f.
Процедура seek(f:file,n:longint) пересуне покажчик у файлі f на початок запису з номером N. Якщо опиниться, що n більше фактичної довжини файлу, то покажчик буде пересунутий і за реальний кінець файлу.
Процедура truncate(f:file) обрізатиме "хвіст" файлу f: всі елементи, починаючи з поточного і до кінця файлу будуть з нього видалені. Насаправді відбудеться лише переписування ознаки "кінець файлу" в те місце, куди указував покажчик, а фізично "відрізані" значення залишаться на колишніх місцях.
Зберігати змінні у файл, відкритий для запису, можна за допомогою команди write(). Так само як і у разі читання, першою указується файлова змінна, а за нею - список виводу:
write(f,a,b,c); - записати у файл f (заздалегідь відкритий для запису командами rewrite(f) або reset(f)) змінні а,b,c.
Виводити у типізований файл можна тільки змінні відповідного опису типу даних. Неіменовані константи, що не типізуються, не можна виводити у типізований файл.
Головна перевага нетипізованих файлів - це висока швидкість їх обробки. В основному це застосовується в тих випадках, коли потрібно копіювати досить великий вміст одного файлу в іншій без змін.
У розділі var файлові змінні, призначені для роботи з файлами, що не типізуються, описуються таким чином:
var g: file;
Ніяка файлова змінна не може бути задана константою.
Залежно від того, які дії ваша програма збирається проводити з файлом, що відкривається, можливе двояке його відкриття:
reset(f[,size]); - відкриття файлу для читання з нього інформації і одночасно для запису в нього (якщо такого файлу не існує, спроба відкриття викличе помилку). Ця ж команда служить для повернення покажчика на початок файлу;
rewrite(f[,size]); - відкриття файлу для запису в нього інформації; якщо такого файлу не існує, він буде створений; якщо файл з таким ім'ям вже є, вся інформація,що містилася в нім раніше, зникне.
Необов'язкова змінна size може задати кількість байтів, що одноразово прочитуються з нетипізованого файлу або записуваних в нього. За умовчанням розмір таких "шматків" приймається рівним 128 байт.
Закриваються нетипізовані файли процедурою close(f), загальною для всіх типів файлів.
Для здійснення запису у нетипізований файл і читання з нього застосовуються дві спеціальні процедури blockread() і blockwrite().
Процедура blockread(f:file; buf,count:word [;result:word]) призначена для читання з файлу f декількох елементів разом (їх кількість указується в змінній count, а довжина встановлюється під час відкриття файлу) за допомогою буфера обміну даними buf. Необов'язкова змінна result може зберігати кількість елементів, фактично лічених з файлу.
Процедура blockwrite(f:file; buf,count:word [;result:word]) проводить запис даних у нетипізований файл за допомогою буфера buf.
Задачі для самостійного розв’язування
Скласти прайс-лист ковбасного відділу для магазину, в якому вказано: назва, завод-виробник, вид(1-варена, 2-копчена), ціна, кількість товару на складі (у кг). Дано назву завода-виробника. Вивести всі дані про ковбасу, яку постачає цей завод на склад.
Скласти анкету працівників порту, в якій вказані: прізвище, ім’я, посада, вік, сімейний стан, розмір заробітної плати, рік прийняття на роботу. Вивести всі дані про працівників, які були прийняті на роботу з 1996 по 2006 роки.
Скласти базу даних суден, які є власністю компанії з Данії: назва, тип судна (1-буксир, 2-пасажирське судно, 3-лісовіз, 4-цементовіз), рік будівництва, район судоходства, відомості про наступний порт, в який воно буде заходити. Знайти відомості про судна, які експлуатуються більше 7 років, враховуючи і 2007 рік.
Скласти прайс-лист для музичного магазину, у якому вказані: виконавець, жанр музики, назва альбому, рік виходу альбому, наявність на складі (1-є на складі, 2-немає), ціна. Знайти всі альбоми і відомості про них за жанром.
Скласти базу даних для бібліотеки, де вказано: назва книги, автор, наявність у фондах бібліотеки, рік випуску. Дано автора книги. Вивести всі відомості про книги написані цим автором.
Скласти прайс-лист для музичного магазину, у якому вказані: виконавець, жанр музики, назва альбому, рік виходу альбому, наявність на складі (1-є на складі, 2-немає), ціна. Знайти всі альбоми, котрі коштують не менше 35 гривень.
Створити базу даних робітників токарного цеху, у якій зазначено: прізвище, ім’я робітника, його посада, кількість фактично відпрацьованих днів, сімейний стан, кількість напрацьованих годин відрядження, дата наступного відрядження (номер місяця). Відобразити дані про робітників, які відпрацювали понад 186 робочих днів.
Створити базу даних гаража вантажівок, у якій вказано: марка авто, серія та державний номер авто, прізвище, ім’я водія, який є власником автомобілю, вантажність машини, наявність машини (1-у гаражі, 2-у відрядженні). Знайти всі відомості про машини, вантажність яких перевищує 5 тон.
Створити базу даних користувачів мережі Інтернет, у якій вказано: прізвище та ім’я клієнта, домашня адреса (назва вулиці та номер будинку), відомості про отриманий обсяг інформації за поточний місяць, статус відносно користування послугами (1-користується, 2-не користується), умови надання послуг (1-помісячна сплата, 2-поквартальна сплата). Дано прізвище користувача. Вивести відомості про клієнтів з заданим прізвищем.
Створити базу даних пацієнтів педіатра, де вказано: прізвище та ім’я дитини, рік народження, назва хвороби, яку переніс, відомості про щеплення, домашня адреса (назва вулиці та номер будинку). Дана домашня адреса дитини. Вивести відомості про дітей, що проживають за заданою адресою.