10 - Маъруза. Типлашмаган файллар.
Режа
Типлашмаган файллар
Типлашмаган файлларни киритиш-чикариш
Типлашган файллардан фарки
3.15Типлашмаган файллар
Типлашмаган файл очиш, блоклар.
Максимал тезликда ишлайдиган файлларни куриб утамиз. Паскал тилидаги типлашмаган файлни белги ва байтлар йигиндисидан иборат деб кабул килинади.
Типлашмаган файлни очиш учун File резервлашган сузидан фойдаланилади:
VAR
UntypedFile : File;
Типлашмаган файл туппадан-тугри киритиш файли булиб, укиш ва ёзиш операциясини бир вактнинг узида ёзиш имкониятини беради. Бу файллар учун энг асосий параметрлар байтлардаги ёзув узунлиги хисобланади. Ёзув узунлиги бир байтга эга булган типлашмаган файлни очиш куйидагича бажарилади:
Rewrite(UntypedFile, 1);
ёки
Reset(UntypedFile, 1);
Факатгина типлашмаган файллар учун кулланиладиган иккинчи параметр файлнинг бир сеансдаги ёзув узунлигини беради.
3.16Типлашмаган файлларни киритиш-чикариш
Типлашмаган файлларда киритиш-чикариш операцияларини Read ва Write операторларидан фойдаланиб, берилганларни узатиш пайтида яхши муваффакиятга эришмаслик мумкин.Шунинг учун берилган типдаги файллар учун Турбо-Паскалда киритиш-чикариш операциясини тезлатиш учун куйидаги 2та янги процедуралар ишлатилади.
BlockRead(VAR F : file; VAR Buf; Count : word {;result:word});
Бу процедура Buf узгарувчисининг F файлидан аник сондаги блокларни хотирага санайди. Buf параметри F файлдан йигиладиган ахборотларни хохлаган узгарувчисини билдиради. Count параметри саналаетган блоклар сонини беради. Result параметри шарт булмаган параметр хисобланиб, процедура чакирилганда саналган езувлар сонини уз ичига олади.
Result параметрларини кулланилиши саналган блоклар сони Count параметрида берилган блоклар сонидан кам булишлигини олдиндан айтади. Агар Result чакириш пайтида курсатилган булса, у холда киритиш-чикариш ситуациясида хатолик булмайди.Укиш вактидаги шунга ухшаш ва бошка хатоларни кузатиш учун IОresult функциянинг {$I-}, {$I+} опциялари ишлатилади.
BlockWrite(VAR F : file; VAR Buf; Count:word {;result:word});
Бу процедура Buf узгарувчисидаги маълум езувлар сонини F файлига тез узатиш учун хизмат килади.BlockWrite процедурасининг барча параметрлари BlockRead процедурасининг параметрларига мос тушади.Иккала процедура хам блокларни киритиш-чикариш операцияларини бажаради. Блокларнинг байтлардаги хажми куйидаги формула оркали аникланади:
Хажм = Count * RecSize, бу ерда RecSize – очилиш пайтида берилган файл езувининг улчови. Бу процедураларнинг кулайлиги шундаки , фойдаланувчи файл операциялари учун буфер улчовини узи аниклаши мумкин. Бу имконият ресурсларни режалаштиришда кул келади.
Мисол. Бу дастур файлни берилган хажм буйича бир неча булакларга булиб, хар бир булакни дискларга алохида езиш имкониятини беради.
PROGRAM DivFile;
CONST
SizeBuffer = 25600; { киритиш-чикариш учун буфер улчови }
TYPE
BufFile = array[1..SizeBuffer] of Byte;
VAR
Buffer: BufFile; { буфер }
W1, W2, W3 : word;
KolZap, Siz : LongInt;
NameFile, NamePart: string[60]; {чикариш ва бош файл номи }
FileMain, FilePart: file; { типлашмаган файллар учун узгарувчилар} Flag1, Flag2 : boolean; { мантикий операциялар учун файллар }
FUNCTION Answer : boolean;
{ Хатолик булган пайтда фойдаланувчи билан мулокот учун функция }
VAR
CH : char;
BEGIN
Write('Ишни давом эттирасизми? (Х/Й)');
REPEAT
Readln(CH);
CASE CH OF
'Д','д': Answer := true;
'Н','н': Answer := false;
END; { case }
UNTIL CH IN ['Х','х','Й','й'];
END; { Answer }
BEGIN { DivFile }
Writeln('DivFile файлни булакларга булиш');
Flag1 := True;
WHILE Flag1 DO BEGIN {бош файллар буйича катта цикл } Write('Булиш учун файл номини киритинг: ');
Readln(NameFile);
Assign(FileMain, NameFile);
Reset(FileMain, 1); { бош файлни очиш, езув узунлиги 1}
KolZap := FileSize(FileMain); { байтлардаги файл улчови }
WHILE KolZap > 0 DO BEGIN { бош файл охиригача }
Writeln('Файлнинг булаги ',NameFile,' = ',KolZap);
Write('Фални булиш ');
Flag2 := Answer;
Writeln;
Write('Чикиш файлини номини киритинг ');
Readln(NamePart);
Assign(FilePart, NamePart);
Rewrite(FilePart, 1); { езув узунлиги 1 а тенг булган бош файл булаги учун чикиш файлини ташкил этиш }
IF Flag2 THEN BEGIN
Write('Чикиш файлини улчовини киритинг ');
Readln(Siz);
IF Siz > KolZap THEN
Siz:= KolZap;
END ELSE
Siz:= KolZap; { акс холда булак улчови бош файл колдигининг улчовига тенг }
{Киритиш-чикариш буфери улчовига коррекция киритилади }
W1 := Siz DIV SizeBuffer; { тула Buffer сони }
W2 := Siz MOD SizeBuffer; { колдик }
Write('Нусха олиш ');
FOR W3 := 1 TO W1 DO BEGIN { тула буферлар буйича }
BlockRead(FileMain, Buffer, SizeBuffer);
BlockWrite(FilePart, Buffer, SizeBuffer);
Write('+');
END;
IF W2 <> 0 THEN
BEGIN
BlockRead(FileMain, Buffer, W2);
BlockWrite(FilePart, Buffer, W2);
Write('+');
END; { if W2 <> 0 }
Writeln;
Close(FilePart); { булак учун файлни епиш }
KolZap := KolZap - Siz; { бош файл колдигини хисоби }
END; { while KolZap > 0 }
Close(FileMain);
Write('Янги файлни булиш, ');
Flag1 := Answer;
END; { while Flag1 }
END. { DivFile }
Бундай дастурга катта хажмли дискдаги берилганлар тупламини кичик хажмли ташувчиларга олиб утишда эхтиеж тугилади Дастур матнини купайтирмаслик учун киритиш-чикариш хатоликлари текширилмайди. Буларни локализациялашда IOresult стандарт функциясидан фойдаланиш мумкин. Агар BlockRead ва BlockWrite 4 та параметрга кенгайтирилган чакирув кулланилса, у холда дастур ичида узатилаетган ахборотлар сонини назорат килиш мумкин.
Назорат саволлари
1. Типлашмаган файлни очиш кандай амалга оширилади?
2. Блок нима?
3. Типлашмаган файлнинг асосий параметри нима?
4. Типлашмаган файлни киритиш чикариш кадай амалга оширилади?
5. Count ни вазифаси нима?
6.Типлашган файл билан типлашмаган файлнинг фарки нимада?
7.BlockRead(VAR F : file; VAR Buf; Count : word {;result:word});
процедурасининг вазифаси нима?
8. Result параметри нима вазифани бажаради?
9.Блоклар хажми кандай аникланади?
10.Хатоликни тузатиш учун кандай файлдан фойдаланилади?
Do'stlaringiz bilan baham: |