Природно, що відомості про тип даних, що зберігаються у файлі важливо задати спочатку. Для цього використовуються спеціальні файлові змінні, що визначають тип файлу. Вони поділяються на ті, що не типізуються і типізуються. Перед початком роботи з будь-яким файлом необхідно описати файлову змінну, що відповідає типу даних цього файлу. Надалі ця змінна використовується при зверненні до файлу.
У Delphi є можливість створювати файли, що не типізуються. Для їх позначення використовується ключове слово file: var Untypedfile: file;
Такі файлові змінні використовуються для організації швидкого і ефективного введення/виводу незалежно від типу даних. При цьому мається на увазі, що дані читаються або записуються у вигляді двійкового масиву. Для цього застосовуються спеціальні процедури блокового читання і запису.
Типізовані файли, забезпечують введення/виведення з урахуванням конкретного типу даних. Для їх оголошення використовується ключове слово file of, до якого додається конкретний тип даних. Наприклад, для роботи з файлом, що містить набір байтів, файлова змінна оголошується так: var Bytefile: file of byte;
При цьому можна використовувати будь-які типи фіксованого розміру, за винятком вказівників. Дозволяється застосовувати структурні типи, якщо їх складові частини задовольняють названому вище обмеженню. Наприклад, можна створити файлову змінну для запису:
type Country = record
Name: String;
Capital: String;
Population: Longlnt;
Square: Longlnt;
end;
var Countryfile: file of Country;
Для роботи з текстовими файлами використовується спеціальна файлова змінна Textfile або Text: var F: Textfile;
Тепер розглянемо дві найпоширеніші операції, що виконуються при роботі з файлами. Це читання і запис. Для їх здійснення застосовуються спеціальні функції файлового введення/виводу.
Отже, для виконання операції читання або запису необхідно провести наступні дії:
1. Оголосити файлову змінну необхідного типу.
2. За допомогою функції Assignfile пов'язати цю змінну з необхідним файлом.
3. Відкрити файл за допомогою функцій Append, Reset, Rewrite.
4. Виконати операції читання або запису. При цьому, залежно від складності завдання і структури даних, може використовуватися цілий ряд допоміжних функцій.
5. Закрити файл за допомогою функції Closefile.
Як приклад розглянемо невеликий фрагмент коду.
...
var F: Textfile;
S: string;
begin
if Opendlg.Execute
then Assignfiie(F, Opendlg.FileName)
else Exit; Reset(F);
while Not EOF(F) do
begin
Readln(F, S);
Memo.Lines.Add(S);
end;
Closefile(F);
end;
...
Якщо в діалозі відкриття файлу Opendlg був вибраний файл, то його ім'я зв'язується з файловою змінною F за допомогою процедури Assignfile. Як ім'я файлу рекомендується завжди передавати повне ім'я файлу (включаючи його маршрут). Якраз у такому вигляді повертають результат вибору файлу діалоги роботи з файлами. Потім за допомогою процедури Reset цей файл відкривається для читання і запису.
У циклі виконується читання з файлу текстових рядків і запис їх в компонент Tmemo. Процедура Readin здійснює читання поточного рядка файлу і переходить на наступний рядок. Цикл виконується, поки функція EOF не повідомить про досягнення кінця файлу. Після завершення читання файл закривається. Такий же код можна використовувати і для запису даних у файл. Необхідно тільки замінити процедуру читання на процедуру запису.
Відкриття файлу може здійснюватися трьома процедурами - залежно від типу його подальшого використання.
1. Процедура procedure Reset(var F: File [; Recsize: Word ]); відкриває існуючий файл для читання і запису, поточна позиція встановлюється на першому рядку файлу.
2. Процедура procedure Append(var F: Text); відкриває файл для запису інформації після його останнього рядка, поточна позиція встановлюється на кінець файлу.
3. Процедура procedure Rewrite(var F: File [; Recsize: Word ]); створює новий файл і відкриває його, поточна позиція встановлюється в початок файлу. Якщо файл з таким ім'ям вже існує, то він перезаписується.
Змінна Recsize використовується тільки при роботі з файлами, що не типізуються, і визначає розмір одного запису для операції передачі даних. Якщо цей параметр опущений, то за замовчуванням Recsize рівне 128 байт.
Читання даних з файлів, що типізуються і текстових, виконують процедури Read і Readin. Процедура Read має різне оголошення для текстових і інших файлів, що типізуються:
· procedure Read([var F: Text;] VI [, V2...,Vn]) - для текстових файлів;
· procedure Read(F, VI [, V2...,Vn]) - для інших типізованих файлів.
При одному виклику процедури можна читати дані в довільне число змінних. Звичайно, що тип змінних повинен співпадати з типом файлу. При читанні в чергову змінну читається рівно стільки байтів з файлу, скільки займає тип даних. У наступну змінну читається стільки ж байтів, розташованих услід. Після виконання процедури поточна позиція встановлюється на першому непрочитаному байті. Аналогічно працюють декілька процедур Read для однієї змінної, виконаних підряд.
Процедура procedure Readln([ var F: Text; ] VI [, V2...,Vn ]); прочитує один рядок текстового файлу і встановлює поточну позицію на наступному рядку.
Процедури для запису у файл write і writein описані аналогічно: procedure Write([var F: Text; ] PI [, P2..., Pn]); procedure Writein([ var F: Text; ] PI [, P2...,Pn ]). Параметри P1, P2..., Pn можуть бути одним з цілих або речових типів, одним із строкових типів або логічним типом. Але у них є можливість додаткового форматування при виводі. Кожен параметр запису може мати форму: Рn [: Minwidth [: Decplaces ] ], де Рn - змінна, що виводиться, або вираз; Minwidth - мінімальна ширина поля в символах, яка повинна бути більше 0; Decplaces - містить кількість десяткових символів після коми при відображенні дійсних чисел з фіксованою крапкою.
Для текстових файлів у функціях Read і write файлова змінна F може бути відсутня. У цьому випадку читання і запис здійснюються в стандартні файли введення/виводу. Коли програма компілюється як консольне застосування, Delphi автоматично пов'язує вхідний і вихідний файли з вікном консолі.
Для контролю за поточною позицією у файлі застосовуються дві основні функції.
1. Функція EOF(F) повертає значення True, якщо досягнутий кінець файлу.
2. Функція EOLN(F) аналогічно сигналізує про досягнення кінця рядка. Природно, як параметр у функції необхідно передавати файлову змінну.
Процедура procedure Seek(var F; N: Longint); забезпечує зсув поточної позиції на N елементів. Розмір одного елементу в байтах залежить від типу даних файлу.
Розглянемо тепер режим блокового введення/виводу даних між файлом і областю адресного простору (буфером). Цей режим відрізняється значною швидкістю передачі даних, причому швидкість пропорційна розміру одного передаваного блоку - чим більше блок, тим більше швидкість.
Для реалізації цього режиму необхідно використовувати файлові змінні, що тільки не типізуються. Розмір блоку визначається в процедурі відкриття файлу (Reset, Rewrite). Безпосередньо для виконання операцій використовуються процедури Blockread і Blockwrite. Процедура procedure Blockread(var F: File; var Buf; Count: Integer [; var Amttransferred: Integer]); виконує запис блоку з файлу в буфер. Параметр F посилається на файлову змінну, що не типізується, пов'язану з потрібним файлом.
Параметр Buf визначає будь-яку змінну (число, рядок, масив, структуру), в яку читаються байти з файлу. Параметр Count містить число прочитуваних блоків. Нарешті, необов'язковий параметр Amttransferred повертає число реально лічених блоків.
При використанні блокового читання або запису розмір блоку необхідно вибирати так, щоб він був кратний розміру одного значення того типу, який зберігається у файлі. Наприклад, якщо у файлі зберігаються значення типу Double (8 байт), то розмір блоку може бути рівний 8, 16, 24, 32 і так далі.
Для того, що б вставити Ассемблерний код в програму на Паскалі, можна скористатися складеним оператором asm... end. Разом із звичайним складеним оператором begin... end Паскаль підтримує і складений оператора asm... end в який записується код не на Паскалі, а на Ассемблері.
Приклад:
var A, B, Max: Integer;
begin Write ('Введіть A: ');
Readln (A); Write ('Введіть B: ');
Readln (B);
asm
mov AX, A
cmp AX, B
jg @e
mov AX, B
@e: mov Max, AX
end; {asm} Writeln ('Max = ', Max);
Readln; end.
Як видно з коду, програма видасть максимальне значення між змінними A і B.
Мова програмування Delphi дуже широко використовується і має дуже велику кількість розроблених елементів та засобів, що значно полегшують розробку додатків. У Delphi, використовується багато передових ідей і концепцій, закладених в графічному інтерфейсі Windows. У середовищі програмування Delphi є всі необхідні інструменти для того, щоб створювати повноцінні програми. Писати, компілювати і тестувати програму – все це можна робити, не виходячи з Delphi.
Завдяки можливості вбудови в програму ассемблерних вставок, програміст отримує змогу створювати програми з інтерфейсом Windows та дуже високою швидкодією, характерною для низькорівневих мов програмування.
1. Delphi 7 / под общ. ред. А.Д. Хомоненко. – СПб.: БХВ-Петербург, 2007. – 1216 с.
2. Assembler. Учебник для вузов. 2-е изд. – СПб.: Питер, 2007. – 637с.
3. Архангельский А.Я. Приемы программирования в Delphi на основе VCL. — М.: «Бином-Пресс», 2006 г. — 944 с.
4. Фленов М.Е. Библия Delphi. – СПб.: БХВ-Петербрг, 2004. – 880 с.
5. Стивенс Р. Delphi. Готовые алгоритмы / Род Стивенс; Пер. с англ. Мерещука П.А. – 2-е изд., стер. – М.: ДМК Пресс; СПб.: Питер, 2004. – 384 с.: ил.