Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб 10.doc
Скачиваний:
3
Добавлен:
29.08.2019
Размер:
146.94 Кб
Скачать

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

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

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

Для опису нетипованих файлів використовується тип File.

Var f: File

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

Для нетипованого файла важливим параметром є довжина запису у байтах. Відкриття нетипованого файла з довжиною запису у n байт можна виконати так:

Rewrite(f [,n]) aбо Reset(f [,n])

Другий параметр задає довжину запису файла на сеанс роботи.

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

Rewrite(f ) aбо Reset(f ).

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

Використовуючи для базових операцій введення-виведення з нетипованими файлами стандартні процедури Read та Write, неможливо досягти великої ефективності у швидкості передачі даних. Тому тільки для даного типу файлів введено дві нові процедури, що підтримують операції введення/виведення з більш високою швидкістю.

BlockRead(Var f: file; var Buf; Count:word[;Result: word]) – процедура зчитує з файла f певну кількість блоків у пам’ять, починаючи з першого байта змінної Buf. Параметр Buf являє собою будь-яку змінну, яка використовується для накопичення інформації з файла f. Параметр Count задає кількість блоків, які зчитуються. Параметр Result є необов’язковим і містить після виклику процедури кількість дійсно зчитаних записів. Використання параметра Result підказує, що кількість зчитаних блоків може бути меншою, ніж задано параметром Count. Якщо Result вказано при виклику, то помилки введення-виведення не виникне. Для відслідкування цієї та інших помилок читання можна використати опції {$I-}, {$I+} і функцію Ioresult.

BlockWrite(Var f: file; var Buf; Count:word[;Result: word]) – процедура призначена для швидкої передачі у файл f певної кількості записів із змінної Buf. Всі параметри процедури BlockWrite аналогічні параметрам процедури BlockRead. Обидві процедури виконують операції введення-виведення блоками. Об’єм блока у байтах визначається за формулою:

Об’єм=Count*RecSize,

де RecSize-розмір запису файла, заданий при його відкритті. Сумарний об’єм разового обміну не повинен перевищувати 64 кбайт. Окрім швидкості передачі даних перевага цих процедур полягає у можливості користувача самостійно визначати розмір буфера для файлових операцій. Ця можливість має велике значення, де необхідне жорстке планування ресурсів.

Приклад. Прочитати файл символів та роздрукувати цю інформацію по 30 символів у рядку.

Program NT_File;

Uses Crt;

Const k_sim=30;

Var Buf: array [1..90] of char;

fname: string[60]; F : file; k, i : integer;

Begin

Write('Ввести _мя файлу'); Readln(fname);

Assign(F,fname); Reset(F,1); {В_дкрити файл}

Repeat

BlockRead(f, Buf, SizeOf(buf),k);

If k=0 then exit; k:=0;

for I := 1 to SizeOf(Buf) do

Begin

Write(buf[i]); k:=k+1;

If k>k_sim then

Begin k:=0; writeln; End;

End;

Until eof(f);

Close(f);

End.

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