Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основи програмування Паскаль.docx
Скачиваний:
51
Добавлен:
12.05.2015
Размер:
511.7 Кб
Скачать

22. Записи. Бінарні файли

Як і масиви, записи ставляться до складених типів даних. Запис складається з фіксованого числа елементів, називанихполями. Кожне поле являє собою змінну простого типу даних – як правило, рядок або число. Суттєво те, що в один запис можуть входити полярізного типу. Наприклад, записом можна вважати рядок екзаменаційної відомості:

Андрєєва С.В. 4 5 5

Даний запис складається із чотирьох полів: одне поле – строкового типу (прізвище й ініціали студента), інші три поля – числові (оцінки студента по трьом дисциплінам).

Опису змінної типу записпередує визначення типу за допомогою оператораType. Для нашого запису цей опис міг би виглядати в такий спосіб:

Type zap = record

fam: string;

m, inf, h: integer;

end;

Тут zap– ім'я нового типу даних, аfam,m,infіh– імена полів записи. Службові словаrecord … endу цьому випадку відіграють роль операторных дужок, усередині яких записуються поля запису із вказівкою їх типів.

Не дуже зручно те, що для кожної дисципліни введене окреме поле. Уведемо тип даних student, де ця проблема вирішена використанням у якості поля масивуballs(бали даного студента по трьом дисциплінам):

Type student = record

fam: string;

balls: array [1..3] of integer;

end;

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

Var str: zap;

або масив таких змінних:

Var students: array [1..20] of student;

Для звертання до окремих полів змінної типу записвикористовуєтьсяселектор запису– це символкрапки, що розділяє ім'я запису й ім'я поля:

Str.fam- поле "Прізвище" записиstr

Students[1].fam- поле "Прізвище" 1-го елемента масиву записівstudents

Students[i].balls[2]- друга оцінка i-гоелемента масиву записівstudents

З полем запису, як і з елементом масиву, дозволені всі припустимі в мові операції над змінної відповідного типу.

Для того, щоб довідатися обсяг у байтах, займаний записом в оперативній пам'яті або на жорсткому диску, слід скористатися стандартною функцією sizeof, передавши їй у якості аргументу ім'я типу записи:

Sizeof (student)- поверне розмір пам'яті в байтах, займаний одному записом типуstudent.

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

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

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

Var файлова_змінна: file of тип_компонентів_файлу;

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

Var f: file of zap;

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

Var f2: file of real;

Тут оголошений файл, що містить дійсні числа у внутрішній виставі. Розмір одному запису такого файлу буде рівний 6 байт (розмір пам'яті, що приділяється під величину типу real).

  • Нетипізовані файли.Задаються стандартним типомfileбез вказівки типу компонент, наприклад:

Var f: file;

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

  • Текстові файли.Знайомі нам по попередньому розділу текстові файли задаються стандартним типомtext, наприклад:

Var f: text;

Компонентами текстового файлу є рядки змінної довжини. Після введення кожного рядка натискається клавіша Enter. Історично зложилося так, що при цьому в кінець кожного рядка дописується дваневидимі символи: символ з кодом 13 (CR, повернення каретки) і символ з кодом 10 (LF, переклад рядка). Доступ до рядків здійснюється послідовно, починаючи з першої. Число рядків у текстовому файлі може бути довільним. Наприкінці файлу автоматично формується ознака кінця файлу – маркер EOF (End Of File).

Суттєво підкреслити те, що перший і другий вид файлів – бінарні, а не текстові:

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

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

Наприклад нескладна програма, що випливає, повідомляє бінарний файл, що полягає з дійсних чисел і записує в нього числа від 1 до 10 включно:

var f:file of real;

r:real;

begin

assign (f,'real.dat');

rewrite (f);

r:=1;

while r<11 do begin

write (f,r);

r:=r+1;

end;

close (f);

end.

Тому що розмір величини типу Realу пам'яті рівний 6 байтам, отриманий файл real.dat буде мати розмір 60 байт і містити внутрішні машинні представлення зазначених чисел:

Ніякого "текстового" змісту в цьому записі ні, щоб її інтерпретувати, потрібно відкрити файл у редакторі, що підтримує 16-ричное "машинне" вистава чисел:

У цій виставі видне, що кожне число займає по 6 байт.

Переписавши програму так, щоб числа писалися " як текст", одержуємо наступне:

var f:text;

r:real;

begin

assign (f,'real.txt');

rewrite (f);

r:=1;

while r<11 do begin

write (f,r);

r:=r+1;

end;

close (f);

end.

Файл real.txt складається з одного рядка ( тому що ми писали тільки оператором write), у цьому рядку наведені дійсні числа в експонентній формі ( тому що ми не вказували ширину й точність):

Розмір файлу рівний 170 байт, він текстовий і його можна відкрити в "Блокноті" Windows.

Важливо засвоїти й те, що для бінарних файлів не має змісту поняття "рядка тексту". Тому читання й запис при роботі з бінарними файлами здійснюються тільки процедурами read і write, але неreadlnіwriteln.

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

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

Function Filesize(Var F) : Longint;- Повертає поточний розмір файлу вкомпонентах(не байтах! Останнє вірно тільки дляfile of byte).

Параметр F- файлова змінна.Filesize(F)повертає число компонентів вF. Якщо файл порожній, тоFilesize(F)повертає нуль. У режимі{$I-}функціяIoresultповерне нуль, якщо операція була успішна, інакше вона поверне відмінний від нуля код помилки. ФункціяFilesizeне може використовуватися для текстових файлів. Файл повинен бути відкритий.

Function Filepos(Var F) : Longint;- Повертає поточну позицію покажчика файлу. ПараметрF- файлова змінна. Якщо покажчик поточної позиції файлу перебуває на початку файлу, тоFilepos(F)повертає нуль. Якщо покажчик поточної позиції файлу перебуває наприкінці файлу, тобто, якщоEof(F)=True, те значенняFilepos(F)дорівнює значеннюFilesize(F).

У режимі {$I-}функціяIoresultповерне нуль, якщо операція була успішна, інакше вона поверне відмінний від нуля код помилки. ФункціяFileposне може використовуватися для текстових файлів. Файл повинен бути відкритий.

Procedure Seek(Var F; N : Longint);- Переміщає поточний покажчик позиції файлу на певний компонент.F- змінна будь-якого файлового типу за винятком текстового,N- вирази типуLongint. Покажчик позиції файлуFпереміщається на номер компонентаN. Номер першого компонента файлу дорівнюєнулю( відповідно, останньої –p-1, деp– загальне число компонентів у файлі). Щоб розширити файл, ви можете пересунути покажчик на один компонент за останній компонент у файлі. Тобто, операторSeek(F, Filesize(F));переміщає поточний покажчик позиції файлу на кінець файлу.

У режимі {$I-}функціяIoresultповерне0, якщо операція була успішна, інакше, вона поверне відмінний від нуля код помилки. ПроцедураSeekне може бути використана на текстових файлах. Файл повинен бути відкритий.

Сама процедура читання або запису бінарного файлу складається з тих же кроків, що для текстового: файл зв'язується з файлової змінної оператором assign, потім відкривається в режиміresetабоrewrite, читання й запис виконуються операторамиreadіwriteвідповідно, по завершенню роботи з файлом його слід закрити операторомclose.

Для бінарних файлів забороненийрежим відкриттяappend, затережим reset дозволяє як читати записи файлу, так і писати в нього. Режимrewriteз бінарними файлами використовується так само, як з текстовими – тобто, тільки при необхідності переписати файл заново.

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

Procedure Erase(Var F);- стирає зовнішній файл із диска. ПараметрF- файлова змінна будь-якого файлового типу. Зовнішній файл, пов'язаний зі змінноїFвіддаляється.

У режимі {$I-}функціяIoresultповерне нуль, якщо операція була успішна, інакше вона поверне відмінний від нуля код помилки. Перед виконанням даної процедури файл треба закрити, якщо він раніше був инициализирован процедурамиreset, rewriteабоappend.

Procedure Rename(var F; Newname);- Перейменовує зовнішній файл. Параметр F- змінна будь-якого файлового типу. ПараметрNewnameмає типString. Зовнішній файл, пов'язаний зі змінноїFперейменовується наNewname. Подальші операції наFвідбуваються вже із зовнішнім файлом з новим іменем.

У режимі {$I-}функціяIoresultповерне0, якщо операція була успішна, інакше, вона повертає відмінний від нуля код помилки.

Розгорнутий приклад на роботу з файлом записів наведено в Додатку 4 (лістинг 4). Його ретельне вивчення допоможе Вам освоїти основні приймання роботи з бінарними файлами. Програма, наведена в лістингу – навчальна, тому "вузьких місць", що викликає сумніву з погляду професійності коду, у ній чимало, по можливості вони закомментированы з відповідними поясненнями.