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

Нетипизираните файлове са файлове, които се поддържат възможно най-бързо. Въвеждането на такива файлове в системата Turbo Pascal беше причинено от желанието да се повиши ефективността на програмите, участващи в интензивен обмен с външни масиви от данни.

Тези файлове, за разлика от вече обсъдените, нямат строго определен тип.

Нетипизираният файл се разглежда в Pascal като колекция от знаци или байтове. Представянето на char или byte не играе никаква роля, важно е само количеството заети данни.

Запазеният файл с думи се използва за дефиниране на нетипизиран файл в програма:

Var MyFile : файл;

Вътрешната поддръжка за такива файлове изглежда е най-близо до хардуерната поддръжка за работа с външни носители. Благодарение на това се постига възможно най-високата скорост на достъп до набори от данни. За нетипизирани файлове няма нужда да губите време за преобразуване на типове и търсене на екраниращи последователности, достатъчно е дапрочетете съдържанието на файла в определена област от паметта.

Нетипизираният файл е файл с директен достъп, което показва възможността за едновременно използване на операции за четене и запис.

За такива файлове най-важният параметър е дължината на записа в байтове. Може да се отвори нетипизиран файл с дължина на запис от 1 байтпо следния начин:

пренаписване(MyFile, 1)илинулиране(MyFile, 1)

Вторият параметър, предназначен само за използване с необработени файлове, определя дължината на файловия запис на сесия.

Характеристика на хардуерната поддръжка е, че при достъп до външно устройство минималният възможен обем за четене е 128 байта. В опит да постигне най-голяма ефективност на файловите операции, Turbo Pascal прие конвенция, според която дължината на записа на нетипизиран файл е 128 байта по подразбиране. Така че след отваряне на файла с обаждания до:

пренаписване(MyFile)илинулиране(MyFile)

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

Turbo Pascal не налага никакви ограничения върху дължината на нетипизиран файлов запис, с изключение на изискването той да бъде положителен и да ограничава максималната дължина до 65 535 байта (капацитет на целочислен тип дума). В този случай трябва да се имат предвид две обстоятелства.

Първо, за да осигурите максимална скорост на обмен на данни, трябва да зададете дължината, която ще бъде кратна на дължината на физическия сектор на дисковия носител на информация (512 байта).

От друга страна, имайте предвид, че общият размер на файла може да не е кратен на избрания размер на запис (последният запис може да не е пълен). За да се гарантира пълно четене на целия файл, епрепоръчително да зададете размера на записа на 1.

Когато работите с нетипизирани файлове, могат да се използват всички процедури и функции, налични за типизирани файлове. Припомнете си тези процедури и функции.

присвояване (Моят файл,'c:\MyDirectory\result.dat') - процедурата за свързване на логическата файлова променлива MyFile с конкретен физически файл на дисков носител;

close (MyFile) - процедура, която затваря отворен файл;

rewrite (MyFile) - процедура, която създава нов файл и го отваря за запис или четене; тази процедура има допълнителна опция при работа с нетипизирани файлове, за която ще стане дума по-късно;

нулиране (MyFile) - процедура, която отваря съществуващ файл с данни; тази процедура има допълнителна опция при работа с нетипизирани файлове, за която ще стане дума по-късно;

eof (MyFile) е булева функция, която проверява дали е достигнат краят на файла;

seek (MyFile, n) - процедура, която ви позволява изрично да промените стойността на указателя на текущия файл, като го зададете на елемента с номер n;

filesize(MyFile) – функция, която връща позицията на показалеца във файла; номерацията започва от нула;

filepos (MyFile) – функция, която връща броя на елементите във файл;

преименуване (MyFile, FileName) - процедура, която ви позволява да преименувате съществуващ файл;

truncate(MyFile) - процедура, която ви позволява да изтриете част от съществуващ файл, започвайки от текущата позиция;

изтриване (MyFile) - процедура, която изтрива посочения файл,

Трябваше да забележите, че в списъка няма процедури за четене и запис. За да чете информация от и да записва информация в нетипизиран файл само за този тип файл, Turbo Pascal въвежда две нови процедури, които поддържат по-бързи I/O операции.

Процедура BlockRead

blockread(Var F : файл; Var Buf; Kolblocks : дума; резултат : дума);

Процедурата чете определен брой блокове от файл F в паметта, започвайкиот първия байт на променливата Buf.

Параметърът Buf представлява всяка променлива, която ще се използва за комуникация с дискове. Тази променлива трябва да бъде описана в програмата, така че нейният размер да не е по-малък от размера на записа, зададен в параметрите за пренаписване или нулиране (като правило за тази цел се използва някакъв масив).

Параметърът резултат е незадължителен и съдържа броя на действително прочетените записи след извикването на процедурата.

Използването на резултатния параметър предполага, че броят на прочетените блокове може да е по-малък от посочения от параметъра Kolblocks. Ако резултатът е указан при извикване, тогава няма да възникне I/O грешка в тази ситуация. Можете да използвате опциите и функцията IOresult, за да проследите тази и други грешки при четене.

Освен факта, че променливата F трябва да бъде декларирана като нетипизиран файл, тя трябва да бъде свързана с конкретен физически диск чрез процедурата за присвояване. Файлът трябва да се отвори с процедурата за нулиране.

Процедура BlockWrite

blockwrite(Var F : файл; Var Buf; Kolblocks : дума; резултат : дума);

Процедурата е предназначена за бързо прехвърляне на определен брой записи от променливата Buf към файла F. Всички параметри на процедурата blockwrite са същите като тези на процедурата blockread. Единствената разлика е, че файлът трябва да бъде подготвен за запис чрез процедурата за пренаписване. Цялото съдържание на променливата Buf се поставя във файла, започвайки с текущия запис.

И двете процедури изпълняват I/O операции на блокове. Размерът на блока в байтове се определя по формулата:

Обем = Kolblocks * recSize,

където recSize е размерът на записа на файла, зададен при отварянето му. Общият обем на еднократен обмен не трябва да надвишава 64 KB. В допълнение към скоростта на пренос на данни, предимството на тези процедурие способността на потребителя самостоятелно да определя размера на буфера за файлови операции. Тази функция играе важна роля в онези задачи, при които е необходимо стриктно планиране на ресурсите. Програмистът трябва да се погрижи вътрешното представяне на променливата Buf да е достатъчно дълго, за да побере всички байтове при четене на информация от диска.

Факт е, че четенето на информация от файл в буфер, както и записът от буфер във файл, се извършва без контрол на типа. Следователно неспазването на определеното условие може да доведе до повреда на данните, съседни на буфера, или до поставяне на външна информация във файла.

Ако променливата Buf не е достатъчно дълга при четене или ако необходимото свободно място не е налично по време на запис на диск, тогава ще се случи следното. Ако последният резултат от параметъра не е указан в тези извиквания, тогава възниква I/O грешка; ако параметърът резултат е зададен, тогава грешката няма да бъде коригирана и след изпълнение на процедурата стойността му няма да съвпада със стойността на параметъра Kolblocks. Последното обстоятелство може да се провери чрез сравняване на двете посочени стойности.

След като процедурата приключи, показалецът се премества към записите с резултати.

Помислете за примери за прости задачи.

Задача 1. Напишете програма, която създава нетипизиран файл от 100 числа и показва k-тия елемент на екрана.

Програма Netipiz1; Използва Crt; Тип FileType = файл; Var f : FileType; P, B, k : байт; Начало ClrScr; присвояване(F, 'Моят файл'); пренаписване(F,1); Произволно подреждане; за k := 1 до 100 do begin P := Random(100); blockwrite(F, P, 1); край; затвори(F); нулиране(F,1); за k := 1 до 100 направете започнете blockread(F, P, 1); запиши(p,' '); край; write('Въведете номера на необходимия елемент '); readln(k); Търсене (F, k-1); blockread(F, P, 1); writeln(k,'-тият елемент от файла е ', P); затваряне(F); Край.

Задача 2. Напишете програма, която прави копие на елементите на нетипизиран файл f и го поставя във файл g.

Програма Netipiz2; Използва Crt; Var f, g : файл; Stroka1, sб Stroka2 : низ; Начало ClrScr; write('Въведете име на изходния файл'); четене (Stroka1); присвояване(f, Stroka1); пренаписване(f,1); write('Въведете съдържанието на файла '); повторете readln(s); blockwrite(f, s, 1); до readKey = #27; затвори(f); нулиране(f,1); write('Въведете името на целевия файл'); четене (Stroka2); присвояване(g, Stroka2); пренаписване(g,1); докато не Eof(f) направете започнете blockread(f, s, 1); blockwrite(g, s, 1); край; затвори(f); близо (g); write('Съдържание на целевия файл:'); докато не Eof(g) направете започнете blockread(g, s, 1); запис(и); край; readln; Край.

Задача 3. Напишете програма, която създава масив от цели числа и го записва в нетипизиран файл, а също така изчислява средноаритметичната стойност на елементите на файла.

Програма Netipiz3; Използва Crt; Var f : файл; i, k, s : цяло число; Mas: масив [1..10] от байт; Начало ClrScr; Произволно подреждане; for i := 1 to 10 do Mas[i] := Random(10); присвояване(f, 'file.dat'); пренаписване(f,1); blockwrite(f, Mas, 10); затвори(f); нулиране(f,1); докато не Eof(f) направете започнете blockread(f, k, 1); s:= s+k; Inc(i); край; затвори(f); запис(s/i:5:2); readln; Край.