русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


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


Дата додавання: 2014-11-28; переглядів: 1651.


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

Андрєєва С.В. 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). Його ретельне вивчення допоможе Вам освоїти основні приймання роботи з бінарними файлами. Програма, наведена в лістингу – навчальна, тому "вузьких місць", що викликає сумніву з погляду професійності коду, у ній чимало, по можливості вони закомментированы з відповідними поясненнями.

 


<== попередня лекція | наступна лекція ==>
Приклади роботи з файлами | Призначення й структура модулів


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн