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

Текстовий файл можна розглядати як послідовність символів, розбиту на рядки. Кожний рядок закінчується спеціальним  маркером кінця рядка. На практиці такий маркер складається з двох символів: переводу рядка (код символу 13) та повертання каретки (код символу 10). Ці символи задають стандартні дії по управлінню обробкою текстових файлів. Особливістю текстового файлу є те, що в мові Паскаль для його оголошення передбачений стандартний тип даних Text. Слід також зазначити, що стандартний передвизначений текстовий файл Input призначений для вводу даних з клавіатури, а файл Output – для виводу даних на екран.

Опрацювання текстових файлів має свою специфіку. Стандартні процедури читання та запису даних read та write дозволяють працювати зі значеннями несимвольного типу. Іншими словами, послідовність символів у спискові вводу чи виводу автоматично перетворюється до значення того типу змінної, яка використовується у файлових операціях. Крім того, зазначені процедури дозволяють за одну операцію вводити чи виводити декілька даних. Ще однією особливістю є те, що окрім зазначених процедур запис даних до текстового файлу можна здійснювати за допомогою процедури  writeln , а читання даних – за допомогою процедури  readln. Відмінність writeln від write полягає у тому, що для першої процедури після запису даних у файл буде вставлений маркер кінця рядка, тобто, наступні дані будуть вводитись у новий рядок файлу. Процедура write записує дані послідовно у один рядок файлу. 

Приклад:

type t: text;

var a,b,c,d :integer;

begin

assign(t,’my_data.txt’); {відкриваємо файл}

rewrite(t);  {для запису даних}

readln(a,b,c,d,e,f);  {вводимо 6 цілих чисел}

write(t,a);  {записуємо число в перший рядок}

writeln(t,b,c); {записуємо ще 2 числа і переходимо до нового рядка файлу}

writeln(t,d);  {записуємо число в другий рядок і переходимо до нового рядка файлу }

write(t,e,f);  {записуємо 2 числа в третій рядок}

close(t);  {закриваємо файл}

end.

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

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

Приклад:

type t: text;

var x,y,z :integer;

begin

assign(t,’my_data.txt’); {відкриваємо файл}

reset(t); {для зчитування даних}

readln(t,x); {з першого рядка читаємо одне число і переходимо до наступного рядка; інші дані цього рядка пропускаються}

readln(t,y,z);  {читаємо одне число з другого рядка і оскільки в другому більше даних немає, одне – з третього, }

writeln(x,y,z); {виводимо числа на друк}

close(t); {закриваємо файл}

end.

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

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

append(t);

де t – файлова змінна.

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

При організації операцій вводу-виводу для текстових файлів використовуються спеціальні функції.

Функція eoln призначена для контролю за знаходженням маркера кінця рядка. Формат функції

eoln(f)

де f – файлова змінна.

Вона повертає значення true, якщо покажчик файлу показує на цей маркер, і значення false у противному випадку.

Функція eof призначена для контролю за знаходженням маркера кінця файла. Її формат аналогічний відповідній функції для типізованих файлів.

Приклад 2.2. Створити текстовий файл, який заповнити випадковими числами. Перший рядок файлу задає кількість чисел n і кількість рядків з даними m. Наступні m рядків містять дані по n/m чисел (передбачається, що n/m – ціле число)

program numbers;

var t: text;

x,m,n,i,j:integer;

begin

assign(t,’numbers.txt’);

rewrite(t);

readln(n,m);

randomize;

for i:=1 to n div m

begin

  for j:=1 to m do

  begin

  x:=random(100);

  write(t,x);

  end;

  writeln(t);

end;

close(t);

end.

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

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

Приклад:

reset (f, 256); {зчитування  даних буде здійснюватись блоками по 256 байт}

rewrite(g); { запис даних буде здійснюватись блоками по 128 байт }

Оголошення нетипізованого файлу здійснюється за такою схемою:

var f:file;

Стандартні процедури зчитування та запису даних не дозволяють досягнути високої ефективності при обробці нетипізованого файлу. Тому для підвищення швидкості обміну даними з не типізованим файлом  використовуються процедури blockread  та blockwrite.

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

blockread(f,x,n,m)

де f – ім’я файлової змінної,

x – ім’я змінної, в яку зчитуються дані;

n – кількість блоків даних, які будуть зчитуватись з файлу;

m – реально зчитана кількість блоків.

Тобто, за один раз можна прочитати не один блок даних, а декілька. Четвертий параметр необов’язковий.

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

blockread(f,x,n,m)

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

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 
25 26 27 28  Наверх ↑