Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
23
Добавлен:
07.02.2016
Размер:
50.18 Кб
Скачать

Лекція №12. Записи і файли.

Текстові файли. Нетипізовані файли.

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

Текстові файли складаються з символів, які організовані в рядки. Описується текстовий файл таким чином:

TYPE FALEZM=TEXT;

VAR F: FALEZM;

або просто

VAR F: TEXT;

Умовно файл можна зобразити як деяку стрічку, у якій є початок (адреса на магнітному диску). Кожний елемент текстового файлу є символ (один байт). Всі елементи текстового файлу записуються послідовно один за одним. Кожний рядок тексту закінчується у файлі спеціальною комбінацією з двох байт, що називається маркером кінця рядка. Весь текст закінчується маркером кінця файлу.

Текстові файли вважаються файлами послідовного доступу. У створений текстовий файл можна тільки дописувати нову інформацію.

При роботі з текстовимим файлами крім уже відомих процедур та функцій можна використовувати такі стандартні функції та процедури:

  • EOLN ( < ім’я файлу > ) { End Of LiNe } - логічна функція, яка приймає значення TRUE, якщо покажчик файлу досягнув маркера кінця рядка, в противному випадку - FALSE.

  • SeekEof(f)- кінець файлу. Відрізняється від Eof(f) тим, що символи пробілу та табуляції, які стоять в кінці файлу, пропускаються.

  • Seekeoln(f)- кінець рядка файлу. Відрізняється від eoln(f) тим, що символи пробілу та табуляції, які стоять в кінці рядка пропускаються.

  • READLN (F,список введення);-процедура пропускає у вхідному текстовому файлі всі символи до початку нового рядка, а буферна змінна приймає значення першого символу цього рядка.

  • WRITELN (F, список виведення);-процедура закінчує поточний рядок текстового файлу і здійснює перехід до початку нового. З’являється ознака кінця рядка.

  • flush(f)- вивільнення буферу вихідного файлу. Інформація з буферу виведення записується в файл, з яким зв’язана файлова перемінна f.

  • SETTEXTBUF(F, BUF [,SIZE])- призначення буфера введення - виведення. Для файлу, з яким зв’язана файлова змінна f, призначається буфер введення - виведення у вигляді перемінної BUF (будь - якого типу). Необов’язковий параметр SIZE задає розмір буферу в байтах. якщо необов’язковий параметр не вказаний, в якості буферу використовується вся перемінна BUF. Якщо ця процедура не використовується, для організації введення - виведення береться стандартний буфер введення - виведення розміром в 128 байт.

Приклад 6. 5. Створити текстовий файл та визначити кількість рядків, в яких є символ ‘j’.

var t:text;

s:string;

k:integer;

begin

assign(t,'tf.txt');

{створюємо текстовий файл}

rewrite(t);

While s<>'*' do

begin

writeln(t,s);

readln(s);

end;

{Передивляємося текстовий файл в пошуку рядків, що мають символ j’}

reset(t);

k:=0;

While not eof(t) do

begin

readln(t,s);

if pos('j',s)<>0 then k:=k+1;

writeln(s);

end;

writeln(k);

end.

Текстові файли можна створювати в редакторові текстів, який відповідає даній операційній системі (наприклад, в NC), а не тільки за допомогою Pascal–програми. Це розширює можливості текстових файлів. Адже створювати файли в редакторі тексту легше, ніж у Pascal, для цього не треба писати відповідну частину програми. Розглянемо попередній приклад в тому випадку, якщо файл був створений у NC.

var t:text;

s:string;

k:integer;

begin

assign(t,'tf.txt');

reset(t);

k:=0;

While not eof(t) do

begin

readln(t,s);

if pos('j',s)<>0 then k:=k+1;

writeln(s);

end;

writeln(k);

end.

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

Append(f);

яка відкриває текстовий файл для дописування даних у кінець файлу. Наприклад:

var t:text;

s:string;

begin

assign(t,'tf1');

append(t);

readln(s);

While s<>'*' do

begin

writeln(t,s);

readln(s);

end;

reset(t);

While not eof(t) do

begin

readln(t,s);

writeln(s);

end;

end.

Це не тільки спосіб доповнення файлу, але і ще одна можливість створення файлу. Адже, якщо спочатку файл був порожній, то ми дописуємо у файл дані, таким чином створюємо його.

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

Приклад 6.6. Прочитати з текстового файлу А всі записані в нього цілі числа, перетворити їх в дійсні та вивести в текстовий файл В по 4 числа в рядку.

var f1, f2: text;

x: real;

i: integer;

begin

{$I-} {внутрішня перевірка правильності операції з файлом}

assign(f1,’A’); {зв’язок з файлом А, який складається тільки з цілих числел}

reset(f1) {відкрити файл для читання}

{$I+} {відключити внутрішню перевірку}

if IOResult <>0 then

writeln(‘ нема файлу A’)

else

begin

assign(f2, ‘B’) {звязок з файлом В}

rewrite(f2) {відкрити файл для запису}

repeat

for i:=1 to 4 do

if not seekeof(f1) then

begin

read(f1,x);

write(f2, x:18) {форматне виведення}

end;

writeln(f2) {перехід на новий рядок}

until seekeof(f1);

close(f1);

close(f2);

end;

end.

В розглянутому прикладі використані вже згадана стандартна функція seekeof(f1) та функція IOResult, яка приймає значення 0, якщо операція введення виведення завершена успішно, та інше значення – в протилежному випадку. Якщо файл, вказаний в процедурі assign(f1,’A’) знайдено успішно, то IOResult дорівнює 0.

Директорія компілятору {$I+}також перевіряє операції введення виведення.

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

Крім розглянутих файлів Turbo Pascal має поняття нетипізованих файлів, які описуються за допомогою службового слова file:

var d: file;

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

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

reset(d, 300);

Якщо другий параметр не вказується явно, то по умовчанню приймається розмір 128 байт. При задані розміру запису треба мати на увазі, що для забезпечення максимальної швидкості обміну довжина запису повинна бути кратна розміру фізичного сектора диска - 512 байт. Але загальний розмір файлу не може бути кратним вибраному розміру запису, тому що останній запис може бути неповним. Щоб гарантовано забезпечити повний перегляд всього файлу, треба встановити розмір запису - 1 байт.

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

  • BLOKREAD(F, BUF, N[, RESULT])- читання компоненти файла. З файлу, з яким зв’язана файлова змінна F, читаються N або менше (якщо при прочитанні досягнутий кінець файлу) елементів та розміщуються в буфері. В якості буферу використовується змінна BUF придатного розміру. Необов’язковий параметр RESULT вертає фактичну кількість прочитаних елементів. Максимальний розмір інформації, яка переноситься, дорівнює N* SIZE та не перевищує 65 535 байт. Після виконання процедури покажчик поточного елементу файлу переміщується на відповідну кількість прочитаних елементів.

  • BLOKWRITE(F, BUF, N[, RESULT]) - запис елемента файла. В файл, з яким зв’язана файлова змінна F, записуються N або менше (якщо при записі досягнутий кінець файлу) елементів та розміщуються в буфері. В якості буферу використовується змінна BUF придатного розміру. Необов’язковий параметр RESULT вертає фактичну кількість записаних компонент. Максимальний розмір інформації, яка переноситься, дорівнює N* SIZE та не перевищує 65 535 байт. Після виконання процедури покажчик поточного елементу файлу переміщується на відповідну кількість записаних елементів.

Таку методику обробки файлів можна застосувати для будь якого файлу. Так, наприклад, розмір запису, заданого в файлі ff.dat, в якому зберігаються дані про студентів:

type stud = record

pr:string[15];

im:string[10];

pb:string[15];

gr:string[8];

oc:record

m,op,f,iu:byte;

end;

end;

має розмір 56 байтів (16 + 11 + 16 + 9 + 4 =56). Для обробки такого файлу як безтипового треба задати процедуру

reset (d, 56);

або

reset(d, sizeof(stud));

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

Контрольні запитання.

  1. Що таке текстові файли:

  2. Який вид доступу до даних можливий для текстових файлів?

  3. Як організується робота з нетипізованими файлами?

  4. Коли має сенс використовувати нетипізовані файли?

Соседние файлы в папке конспект лекцій 1 паск