Моя власна база даних, Delphi, Програмування, статті

WWW.ІСХОДНІКІ.РУ

(Переклад однойменної статті з сайту delphi.about.com )

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

Постановка завдання: Допустимо, мені потрібно вдодатку Delphi зберігати деяку інформаціюна диск. Мені не хочеться працювати з текстовимифайлами, так як перегляд та оновленняінформації в них досить тоскне заняття.Переважати будуть операції запису і читання, в точас як операції зміни і апдейта будутьбути присутнім в меншій мірі. Вся інформаціябуде зберігається в перевизначенні типі данихPascal Record. Отже, який підхід мені найкращевикористовувати?

BDE плюс Paradox або Access, … дякую, не треба … Нехотілося б відчувати мороку з BDE. Використовуватитекстові файли ASCII? Не піде. Потрібна хочякась мінімальна захист, а текстові файли”Повністю видимі”. Виявляється, відповідь надане питання криється в Delphi, а саме в недрукованихфайлах (Або файли деяких типів/бінарніфайли).

Файли

В Delphi існує три класи файлів: typed, textuntyped. Файли typed – це файли, які містятьдані певного типу, такі як Double, Integer абопопередньо визначений тип Record. Текстовіфайли містять читаються символи ASCII. Файли Untypedвикористовуються в тому випадку, якщо ми хочемо працюватиз файлом через певну структуру.

Файли Typed

На відміну від тектових файлів, які містятьрядки, що завершуються комбінацією CR / LF, файли typedмістять дані, взяті з певноїструктури даних.

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


type
  TMember = record
    Name : string[50];
    eMail : string[30];
    Posts : LongInt;
  end;
  
 var Members : array[1..50] of TMember;

Перед тим, як ми зможемо записати інформацію надиск, нам необхідно оголосити змінну типу file.Наступний рядок оголошує змінну файлу F:


 var F : file of TMember;

Зверніть увагу: Щоб створити файлtyped в Delphi, ми використовуємо наступний синтакс:
var SomeTypedFile : file of SomeType
Базовий тип (SomeType) для файлу може бутискалярним (на зразок Double), масивом або записом.Він не може бути довгою рядком, динамічниммасивом, класом, об’єктом або покажчиком.

Щоб почати працювати з файлом з Delphi нам треба пов’язатифайл на диску зі змінною файлу в нашійпрограмі. Для цього використовуємо процедуру AssignFile.


 AssignFile(F, 'Members.dat')

Як тільки зв’язок із зовнішнім файлом встановлена,змінну F необхідно ‘відкрити’ для підготовкиїї до читання або запису. Для відкриттяіснуючого файлу ми використовуємо процедуру Resetабо Rewrite для створення нового файлу. Післятого, як програма закінчить обробку файлу, йогонеобхідно закрити за допомогою процедури CloseFile.Відразу після закриття файлу, пов’язаний з нимзовнішній файл буде оновлено. Потім зміннуфайлу можна пов’язати з іншим зовнішнім файлом.Взагалі, ми повинні завжди проводити обробкувиняткових ситуацій, так як при роботі зфайлами може відбуватися досить багато помилок.Наприклад, якщо ми викличемо CloseFile для файла,який вже закритий, то Delphi видасть помилку I / O. Зіншого боку, якщо ми спробуємо закрити файл,до виклику AssignFile, То результати можуть бутинепередбачуваними.

Запис

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


 var F : file of TMember;
begin
 AssignFile(F,'members.dat');
 Rewrite(F);
 try
  for i:= 1 to 50 do
   Write (F, Members[i]);
 finally
  CloseFile(F);
 end;
end;

Читання

Для отримання всієї інформації з файлу ‘members.dat’використовується наступний код:


 var Member: TMember
     F : file of TMember;
begin
 AssignFile(F,'members.dat');
 Reset(F);
 try
  while not Eof(F) do begin
   Read (F, Member);
 {Щось робимо з даними;}
  end;
 finally
  CloseFile(F);
 end;
end;

Зверніть увагу: Eof це функція перевіркикінця файлу (EndOfFile). Ми використовуємо цю функцію,щоб не вийти за межі файлу (за межіостанньої, збереженої записи).

Пошук і позиціонування

Зазвичай, доступ до файлів здійснюєтьсяпослідовно. При читанні з файлу (використовуючистандартну процедуру Read) або при записі (використовуючистандартну процедуру Write), поточна позиція вфайлі переміщається на наступний по порядкукомпонент (наступний запис). До файлів typed так самоможна звертатися через стандартну процедуру Seek,яка переміщує поточну позицію у файлі назазначений компонент. Для визначення поточноїпозиції у файлі і розміру файлу можнавикористовувати функції FilePos і FileSize.


{Встановлюємо на початок - на перший запис}
Seek(F, 0);

{Встановлюємо на 5-у запис}
Seek(F, 5);

{Переходимо в кінець - "після" останнього запису}
Seek(F, FileSize(F));

Зміна та оновлення

Ми розібралися як записувати і зчитувати зфайлу масив Members. А що, якщо нам потрібно знайтидесятий запис і змінити в ній e-mail? Давайтеподивимося на процедуру, яка робить це:


procedure ChangeEMail
  (const RecN : integer; const NewEMail : string);
var DummyMember : TMember;
begin
 {Зв'язування, відкриття, блок обробки виключень}
 Seek(F, RecN);
 Read(F, DummyMember);
 DummyMember.Email := NewEMail;
 {Читання переміщається на наступний запис, для цього необхідноповернутися на первісну запис, а потім записати}
 Seek(F, RecN);
 Write(F, DummyMember);
 {Закриваємо файл}
end;

Все готово

Отже, тепер ми маємо все, що нам потрібно дляреалізації нашого завдання. Ми можемо записатиінформацію на диск, вважати її, і навіть змінитидеякі дані (наприклад, e-mail) в “середині”файлу.
Найголовніше, що цей файл не в ASCII форматі, іось як виглядає в Notepad (тільки один запис):

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*