Lazarus - крос-платформний Delphi

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

Lazarus - крос-платформний Delphi Програмування для вільних людей

Частина 4. Робота із файлами.

Файли – це набір інформації, що знаходиться на дискових носіях або пам'яті.

Файли бувають різних типів і можуть мати різні формати. Кожен файл має назву, а довжина визначається обсягом інформації, поміщеним у нього. Об'єм файлу може обмежуватися дисковим накопичувачем або системними можливостями (наприклад, Windows Me/98/95 не може створювати файли більше 2 Гб, у Windows NT/XP у NTFS файли можна створювати розміром до 16 Гб).

У Паскалі існує 3 типи файлів:

  1. TextFile – текстовий файл. Це набір символьних рядків певної довжини. [7]
  2. File of – типізований файл. Є набором даних зазначеного типу.
  3. File – нетипізований файл. Являє собою набір неструктурованих даних.

var log_file: textfile; // Текстовий файл pokazanija :fileof integer ; // Типізований файл з цілими значеннями blob_file :file ; // Не типизований файл

Основні команди роботи з файлами

Для використання файлової змінної необхідно її зв'язати із файлом:

Існуючий файл можна відкрити за допомогою процедури:

Якщо файлу із заданою назвою немає, тоді буде помилка.

Новий файл можна створити та відкрити для запису за допомогою процедури:

Якщо файл існує, він видаляється, але в його місці записуються нові дані.

Для відкриття текстового файлу можна використовуватипроцедуру:

Ця процедура працює лише з наявним файлом. Якщо файл відсутній, виникає помилка. Ця процедура відкриває файл для додавання інформації та встановлює покажчик на кінець файлу.

Для того, щоб закрити файл потрібно виконати процедуру:

Ця процедура не розриває зв'язок, тому його можна відкрити повторно без виклику Assign.

Щоб перевірити існує файл чи ні, використовується процедура:

Текстові файли

Текстовий файл є послідовністю рядків. Наприкінці кожного рядка розташований символ завершення рядка EOLN (символ #13), за яким може йти символ перекладу рядка LF (#10). Закінчується текстовий файл символом закінчення EOF (#26).

Для введення даних з будь-якого текстового файлу можна скористатися відомими нами функціямиread таreadln. Тільки першим агументом у цих функціях повинна йти файлова змінна.

read(f, data); - Читає рядок з файлу f в змінну data.

readln(f, data); - Читає рядок з файлу f в змінну data і після цього переходить до наступного рядка.

Процедура write і writeln здійснюють виведення текстовий файл.

write(f, data); - Дані з data записуються в текстовий файл.

writeln(f, data); - Дані з data записуються в текстовий файл і здійснює перехід на наступний рядок.

Для роботи з текстовими файлами потрібно знати функції:

function Eof [(var F:FileText)]: Boolean; // Функція повертає true, якщо досягнуто кінець файлу.

function SeekEof [(var F:FileText)]: Boolean; // Аналогічна Eof, але пробіли, табуляція та маркери кінця рядка пропускаються.

функція SeekEoln [(var F : FileText )]: Boolean; // Аналогічна Eoln, але пробіли, табуляція та маркери кінця рядка пропускаються.

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

Лістинг програми (на компакт-диску див. каталог: TextFile):

program consple_laz; // Програма читає текст з клавіатури та записує його у файл. // При повторному завантаженні програми завантажується раніше введений текст.Uses SysUtils;var f: TextFile; // Текстова змінна data:string ; // Змінна з нашими данимиbegin AssignFile (f, 'data.txt'); // Зв'язуємо змінну з файлом // Якщо файл існує, тоді показуємо раніше введену інформаціюif FileExists ( 'data.txt')thenbegin Reset (f); // Відкриваємо файл для введення/виведення інформаціїwhilenot Eof (f)dobegin readln (f, data); // Читаємо рядок з файлу writeln (data); // Виводимо рядок на екранend ; CloseFile (f); // Закриваємо файл Append (f); // Відкриваємо файл додавання інформаціїendelse rewrite ( f ); // Оскільки файл немає, створюємо його Writeln ; // Вводимо текст і зберігаємо його у файлі Writeln ('Enter the text.'); // Виводимо запрошення readln (data); // Читаємо дані з клавіатури writeln (f, data); // Зберігаємо введену інформацію у файл CloseFile (f); // Закриваємо файл read; // Очікуємо натискання клавішіend.

Типізовані файли

Типізовані файли призначені для зберіганняінформації однакового типу.

Введення/виведення інформації в них здійснюється за допомогою процедур read, readln, write і writeln.

Для типізованих файлів передбачено додаткові процедури та функції:

procedure Seek (var F; N: Longint); // Переміщує покажчик на елемент з номером Nfunction FilePos (var F ): Longint; // Повертає номер поточного елемента.function FileSize (var F ): Integer ; // Повертає кількість елементів у файлі

Приклад: Згенеруємо 100 цифр і запишемо їх у файл. Потім витягнемо з файлу кожен 10-й елемент.

Лістинг програми (на компакт-диску див. каталог: Typycal_File):

program consple_laz; // Програма читає текст з клавіатури та записує його у файл. // При повторному завантаженні програми завантажується раніше введений текст.Uses SysUtils;Const KolElems = 100; // Кількість елементів у масиві CountCol = 10; // Кількість стовпців SpaceSimb = 7; // Відстань між символамиvar f :Fileof integer; // Текстова змінна data :arrayof integer ; // Масив з нашими даними i: integer; // Змінна для лічильника data_int: integer; // Ціле число, яке отримуємо з файлуbegin SetLength (data, KolElems); // Встановлюємо розмір масиву в 100 Randomize; // Встановлюємо генерацію випадкових чисел WriteLn ('Generate Values:'); // Генеруємо випадкові значенняfor i := low (data)to high (data)dobegin data [i]: = Round (Random (1000)); // Встановлюємо випадкове число // Виводимо елементи на екран (по 5 штук у рядку) write ( data [ i ]:SpaceSimb); // На кожному 5-му рядку переходимо на наступний рядок // Додаємо 1, т.к. перший елемент - нульовийif ((i + 1)mod CountCol = 0)then writeln;end ; AssignFile (f, 'data.txt'); // Зв'язуємо змінну з файлом rewrite (f); // Переписуємо файл // Зберігаємо інформацію у файліfor i := low (data)to high (data)dobegin Write (f, data [i]);end ; CloseFile (f); // Закриваємо файл Reset (f); // Відкриваємо файл для введення/виведення інформації WriteLn; WriteLn ( 'Execute Values:' ); // Читаємо і виводь кожен десятий елементfor i := 1to ( high ( data )div 10 )dobegin Seek (f, i * 10 - 1); // Пересуваємось на 10 позицій, але враховуємо, що спочатку // знаходилися на першій позиції Read (f, data_int); WriteLn ( Format ( 'Position %d=%d' ,[ i * 10 , data_int ]));end ; CloseFile (f); // Закриваємо файл read (data [1]); // Очікуємо натискання клавішіend.

Результат виконання програми:

Generate Values:954 371 631 178 618 84 965 490 390 362930 862 860 154 964 412 6175 283 874 516 610 9 606 673 120 49213 477 357 984 451 229 856 409 941 224 6 22 897 894 995 655519 858 364 284 298 4 134 46 110 536263 166 432 103 932 705 647 942 35 319 794 331 631 891 464 440 103243 435 93 11 767 359 168 971 832 479854 93 799 380Execute Values:Position 10=362Position 20=807Position 30=49Position 40=224Position 50=655Position 60=536Position 70=304Position 80=103Position 90=479

Нетипізовані файли

Нетипізований файл – це послідовність байтів, без певної структури, записана у файл.

На відміну від інших типів файлів у процедурах відкриття та запису додається ще один параметр – розмір запису. Якщо цей параметр не буде вказано, він приймається 128 байтам.

Максимальний розмір запису – до 2 Гб. Найбільш оптимальний розмір запису з погляду швидкості – це фізичний розмір сектора накопичувальному пристрої. Найчастіше він становить 512 байт. Слід зазначити, що швидкість роботи непізованими файлами значно вище, ніж з іншими типами файлів.

Замість процедур read та write для нетипізованих файлів використовуютьсяBlockRead таBlockWrite:

Де F – файлова змінна;

Buf – змінна для збереження/читання даних з файлу. Розмір цієї змінної може бути: Count*RecSize байтів;

Count – вказує скільки записів необхідно записати/прочитати за одне звернення до файлу;

Лістинг програми (на компакт-проект Ви можете знайти в каталозі Notypycal_File):

Результат виконання програми:

Деякі процедури для роботи з файлами

Розглянемо деякі процедури та функції для роботи з файлами, які можуть знадобитися у майбутньому [7].

procedure ChDir (S:String ); // Змінює поточну папку на папку, вказану в символьному рядку S

function DeleteFile (const FileName :String ): Boolean ; // Видаляє файл із заданою назвою

procedure GetDir (D: Byte;var S:String ); // Повертає поточну директорію

procedure MkDir (S:String ); // Створення каталогу під назвою S.

procedure Rename (var F ; NewName :String ); // Перейменовує файл, пов'язаний зі змінною F. Нова назва - NewName

procedure RmDir (S:String ); // Видаляє каталог. Видалення буде успішним, якщо папка порожня.