Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pascal.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
3.44 Mб
Скачать

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

Нетипізовані файли ще називаються двійковими, оскільки їх елементами є двійкові числа. У таких файлах тип компонентів не вказується (він може бути будь-яким): їх файлова змінна оголошується лише зарезервованим словом file. Нетипізовані файли дозволяють обробляти дані, не замислюючись про їх тип, з їх допомогою можна записати на диск довільну ділянку використовуваної пам'яті комп'ютера і зчитати її в пам'ять диска, при цьому здійснити доступ до кожного байта пам'яті. Але, перш за все, нетипізовані файли призначені для реалізації запису і зчитування з максимально можливою швидкістю.

При використанні цих файлів процедури reset(«ФЗ»[,rozmir]) і rewrite(«ФЗ»[,rozmir]) мають необов'язковий параметр rozmir, який задає розмір (буфера) порції інформації, що пересилається (копіюється), в байтах.

За замовчуванням цей розмір дорівнює 128 байтам.

Приклад 2:

Опис і відкриття нетипізованого файлу:

const

...

rozmir:word=512; {типізована константа}

...

var

f:file;

...

begin

...

assign(f,'D:\N_T_File.Dat');

reset(f,rozmir); {розмір порції (буфера)}

...

Всі стандартні підпрограми для обробки типізованих файлів використовуються і для нетипізованих файлів, за винятком процедур read і write, які для нетипізованих файлів замінюються високошвидкісними процедурами blockread і blockwrite.

Процедура blockread(«ФЗ»,Bufer_Bl,N[,rezultat]) читає з файлу ФЗ N порцій (через буфер) інформації і розміщує їх в спеціальному буфері блоку. У якості такого буферу використовується змінна Bufer_Bl – це масив елементів (типа byte) файлу із загальним об'ємом rozmir*N (тобто N об'ємів звичайного буфера). Необов'язковий параметр rezultat повертає фактичну кількість прочитаних порцій. Цей параметр корисно використовувати у тому випадку, коли вже досягнутий кінець файлу, а практичне число прочитаних порцій ще не стало рівним заданому значенню, проте для подальшої обробки даних потрібна загальна кількість фактично прочитаних порцій. Якщо в процедурі blockread вказана змінна Bufer_Вl недостатнього об'єму або якщо в процесі запису на диск не виявиться необхідного вільного місця, то виникне помилка вводу-виводу (при цьому відбудеться зупинка роботи програми), яку можна заблокувати, вказавши необов'язковий параметр rezultat.

Максимальний об'єм інформації, яка переноситься через буфер блоку (rozmir*N) не може перевищувати об'єм 65520 байт. Це зумовлено тією обставиною, що змінна Bufer_Bl є масивом, об'єм якого не може перевищувати вказане значення.

Приклад 3:

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

  1. Створити файл початкових даних – масив з n цілих чисел.

  2. Ввести в програму інформацію з файлу початкових даних, вивести її у файл з результатами.

  3. Відсортувати масив за зростанням елементів.

  4. Вивести відсортований масив у файл з результатами.

Приклад файлу початкових даних Isx_Dan.pas

5 4 3 2 1

Приклад файлу з результатами Rez_Dan.pas

Вихідний масив R

5 4 3 2 1

Масив R після сортування

1 2 3 4 5

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

program TextFile;

uses crt;

const

n=5; {довжина масиву}

k_isx='D:\Isx_Dan.Pas'; {ім'я зовнішнього файлу з вихідними даними}

k_rez='D:\Rez_Dan.Pas'; {ім'я зовнішнього файлу з результатами}

tурe

Int_n=1..n;

Mas=array[Int_n] of integer;

var

i:Int_n; R:Mas;

F_Isx, F_Rez:Text; {файлові змінні}

procedure Chtenie; {зчитує із зовнішнього файлу в масив R}

begin

assign(F_Isx,k_Isx); {здійснює зв'язок ФЗ F_Isx із зовнішнім файлом}

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

for 1:=1 to n do

read(F_Isx,R[i]);

close(F_Isx); {закриває файл з вихідними даними}

end; {Chtenie}

procedure Pechat(M:Mas); {друк даних}

var

j:Int_n;

begin

for j:=1 to n do

write(F_Rez,M[j]:4);

writeln(F_Rez);

end;{Pechat}

procedure Sort(var M:Mas);

var

i, Candidat:Int_n;

x:integer;

begin

for i:=1 to n-1 do

for Candidate i+1 to n do

if M[i]>M[Candidat]

then

begin

x:=M[i];

M[i]:=M[Candidat];

M[Candidat]:=x;

end; {then}

end; {Sort}

begin

clrscr;

Chtenie;

assign(F_Rez,k_rez); {зв'язок ФЗ F_Rez із зовнішнім файлом}

rewrite(F_Rez); {відкриває зовнішній файл для запису}

writeln(F_Rez,'Вихідний масив R:');

Pechat(R);

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

Sort(R);

append(F_Rez); {відкриває файл для його розширення або дозапису}

writeln(F_Rez,' Масив R після сортування');

Pechat(R);

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

end. {Text_File}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]