(HANDLE) 9.1. Conceptul e !n!c"to# lo$!c (%"nle) Alocarea fiierelor pe disc este discontinu pe clustere a cror adres se afl din tabela de alocare a discului (FAT). Programatorul vede fiierul ca fiind continuu, iar adresa unei informaii se d relativ la nceputul fiierului. !ist un singur mod de organi"are a fiierelor pe disc, cel pre"entat la nceputul capitolului i dou moduri de e!ploatare# E&plo"t"#e" '!(!e#elo# cu ut!l!)"#e FC* a fost prima modalitate e!istent n $%& i reali"ea" citirea'scrierea din fiier l" n!+el e ,n#e$!-t#"#e, specific(nd lungimea nregistrrii i numrul nregistrrii transferate. E&plo"t"#e" '!(!e#elo# cu !n!c"to# lo$!c permite adresarea informaiei l" n!+el e octet '"./ e ,nceputul '!(!e#ulu!0 specific(nd lungimea transferat n octei. )etoda a aprut n $%& *+, c(nd prin apariia ,ard-disc-ului pe P. /T (01)2), sau introdus subdirectoare i trebuia specificat numele fiierului i calea. 3n F.2 se putea specifica numai numele fiierului. 3n $%& *+ s-a adugat un nou set de funcii pentru e!ploatarea informaiilor din fiiere sc,imb(nd i principiile de lucru. 4a iniiali"area sistemului se aloc un numr de peste 011 de F.2-uri gestionate de sistem. Aceasta este limita numrului de fiiere care vor putea fi desc,ise simultan n aplicaii. Nu1ele '!(!e#ulu! inclusiv calea se d ntr-un te!t A&.33 de lungime variabil te#1!n"t cu 22H definit sub forma# F!-1 D* 3C45P#o$5L"6o#"to#5PLA5F!-!e#1.t&t302 4a e-c%!e#e" '!(!e#ulu! se ncarc n D74DX adresa te!tului care d nu1ele '!(!e#ulu!. &e caut fiierul n directorul specificat i i se aloc un F.2 sistem al crui %"nle# (po!nte#) -e #etu#ne")/ ,n #e$!-t#ul AX i -e +" ,nc"#c/ ,n *X naintea apelrii altor funcii care se refer la acel fiier. $up e!ecutarea oricrei funcii CF82 dac ope#".!" " #eu(!t i CF81 dac a aprut o e#o"#e. $ac se utili"ea" e!ploatarea cu indicator logic atunci trebuie specificat adresa primului octet citit'scris din fiier i lungimea n octei a informaiei transferate. Adresa octetului curent referit din fiier se ine n pointerul de citire'scriere (din F.2-ul alocat), care se modific cu funcia de po"iionare (506). 4a desc,iderea fiierului adresa curent este 1 i se refer la nceputul fiierului. 0 F!-!e#.t&t A#.!n '!-!e# (Pointer cit'scr) *X8%"nle# CX8lun$ !n octet! 9e1o#!e D74DX 9.:. Func.!! DO7 ;CH C#e"#e '!(!e# (C#e"te) .reea" n directorul specificat o etic,et de fiier nou. A67+.6 codul funciei de creare fiier nou D74DX 7adres ir A&.33 cu nu1ele '!(!e#ulu! urmat de 116 CX conine "t#!6utul '!(!e#ulu! 11 8 fiier normal 10 8 fiier read'onl9 (prote:at la scriere) 1; 8 fiier ascuns 15 8 fiier sistem Ie(!#e dac CF82 atunci AX con.!ne !n!c"to#ul lo$!c (,andle) atribuit fiierului CF81 operaie eronat i A/ conine codul erorii (+ nu s-a gsit calea, 5 prea multe fiiere desc,ise, < acces inter"is) ;DH De-c%!e#e '!(!e# e&!-tent (Open) se poate desc,ide orice fiier inclusiv cele ascunse. 3ntrare A67+$6 codul funciei $%& A4 conine coul e "cce- (1 citire permis,0 scriere permis, ; scriere citire, primii bii acces parta:at) D74DX 7adres ir A&.33 cu nu1ele '!(!e#ulu! urmat de 116 Ie(!#e AX con.!ne !n!c"to#ul lo$!c (,andle) sau cod de eroare (.F70) ;EH Inc%!e#e '!(!e# 3nc,ide fiierul al crui !n!c"to# lo$!c -<" "t ,n *X A67+6 cod funcie $%& nc,idere fiier *X 8!n!c"to#ul lo$!c al fiierului ; ;FH C!t!#e !nt#<un '!(!e# (Re") indicat prin 2/ care conine indicatorul alocat (,andle), ntr-o "on de memorie dat prin $&#$/ de la adresa de fiier indicat de pointer-ul de citire'scriere i lungime n numr de octei dat n ./. 3ntrare A6 7 +F6 cod funcie $%& de citire din fiier *X 8 !n!c"to# lo$!c fiier referit (,andle) D74DX 8"#e-/ )on/ de memorie (buffer) CX 8nu1/# e octe.! transferai (lungime) 3eire A/ 7numr de octei citii dac .F71 (A/71 este %F sf(rit de fiier). 3ncrementare automat pointer citire'scriere cu lungimea citit. =2H 7c#!e#e ,nt#<un '!(!e# (>#!te) indicat prin 2/, care conine indicatorul alocat (,andle), dintr-o "on de memorie dat prin $&#$/, la adresa de fiier indicat de pointer-ul de citire'scriere i lungime n numr de octei dat n ./. Pointerul de scriere'citire se incrementea" automat cu lungimea transferat dup operaie. 3ntrare A6 7 +F6 cod funcie $%& de scriere n fiier *X 8 !n!c"to# lo$!c fiier referit (,andle) D74DX 8"#e-/ )on/ de memorie (buffer) CX 8nu1/# e octe.! transferai (lungime) 3eire dac .F71 operaie reuit =1H te#$e#e" unu! '!(!e# a crui nume se d ca te!t A&.33 n $&#$/ (inclusiv calea). $ac se omite discul sau calea se ia din directorul curent. A67506 cod funcie $%& tergere fiier *X8!n!c"to# lo$!c fiier referit (,andle) =:H Po)!.!on"#e po!nte# c!t!#e?-c#!e#e (L7EE@) pentru fiierul asociat indicatorului logic (,andle) dat n 2/ i pstrat n F.2-ul alocat de sistem, preci"(nd referina (adresa curent, nceputul sau sf(ritul fiierului). $up fiecare transfer pointerul de citire'scriere se actuali"ea" cu lungimea transferat. A675;6 cod funcie po"iionare pe fiier AL coul 1etoe! de po"iionare 1 8 fa de nceputul fiierului 0 8 fa de po"iia curent ; 8 fa de sf(ritul fiierului *X 8 !n!c"to#ul lo$!c al fiierului referit (,andle) CX4DX 8"#e-" #el"t!+/ ,n '!(!e# ,n octei a informaiei ce se transfer =;H C!t!#e?7et"#e "t#!6ute '!(!e# permite sc,imbarea atributelor fiierului setate la creare sau pe parcurs. A675+6 funcie $%& setare atribute fiier AL 8 co -u6'unc.!e (1 8 citire atribute, 0 8 setare atribute) D74DX 8 "#e-/ nu1e '!(!e# ca te!t A&.33 CX +"lo"#e "t#!6ute citite sau de setat (1 8 normal, 0 8read'onl9,; 8 ascuns, 5 sistem, ;16 ar,iva). + 9.;. P#o$#"1 e -c#!e#e -! c!t!#e te&te ,n '!(!e# Pre"entm mai :os un e!emplu de scriere i citire r(nduri de te!t ntr-un fiier e!ploatat cu indicator logic. &e observ modul de definire a numelui fiierului. 4a nceput se definesc macroinstruciunile utili"ate la apelarea funciilor $%&, care pot fi plasate ntr-un fiier program separat pentru a putea fi utili"ate i din alte programe. Prin directiva 3=.4>$ fiierul de macroinstruciuni se copia" n seciunea ..%$ din program. &e vor concepe alte programe care s utili"e"e macroinstruciunile definite. A UTILIBARE FI7IERE PRIN IDENTIFICATOR LOGIC A DEFINIRE 9ACROIN7TRUCTIUNI FOLO7ITE ? 77777777777777777777777777777777777777777 A CITIRE 7IR DE LA CON7OLA 7I CO9PLETARE LF 7I C ? ----------------------------------------- c!tD-!# 1"c#o -!#1 A completare .@,4F i ABA dup te!tul introdus mov d!,offset sir0 ? adresa de receptie mov a,,1A, ? functie dos citire sir int ;0, !or b,,b, ? in 2/ lungime sir receptionat mov bl,sir0C0 mov sir0Db!C+E,01 ? cod 4F (linie noua) la sfirsit mov sir0Db!C5E,FBF ? indicator sfirsit sir mov dl,01 ? linie noua dupa receptie mov a,,1;, ? functie afisare un caracter int ;0, endm A AFI7ARE 7IR TER9INAT CU C PE ECRAN ? ----------------------------------------- t!pD-!# 1"c#o -!#: mov d!,offset sir; ? adresa sir de afisat mov a,,1G, ? functie afisare sir int ;0, endm 5 A AFI7ARE EROARE DUPA EXECUTIE 9ACRO ? ----------------------------------------- t!pDe## 1"c#o n# A "'!("#e nu1"# e#o"#e tipHsir err ? afisare mesa: de eroare mov dl,nr ? urmat de numar eroare or dl,+1, mov a,,1;, ? afisare un caracter int ;0, mov dl,01 ? rind nou - 4F si .@ int ;0, mov dl,0+ int ;0, mov a,,5., ? terminare program int ;0, endm A DE7CHIDERE FI7IER EXI7TENT ? ----------------------------------------- opD'!- 1"c#o nu1e10%"nle ? nume si adresa indicator logic local cont ? etic,eta locala in macro clc ? anulare fanion .F mov a,,+d, ? functie desc,idere fisier mov d!,offset nume0 ? adresa "ona cu nume fisier mov al,1;, ? mode de desc,idere @'I int ;0, :nc cont ? .F 7 1 operatie corecta t!pDe## "l A CF 8 1 afisare eroare din A4 cont label near ? definire etic,eta locala 1o+ %"nle0"& A -"l+"#e !n!c"to# lo$!c !n AX endm A INCHIDERE FI7IER ?------------------------------------------ clD'!- 1"c#o %"nle1 ? adresa indicator logic local cont clc mov a,,+e, ? functie inc,idere fisier mov b!,,andle0 ? incarcare indicator logic int ;0, :nc cont ? .F 7 1 operatie corecta tipHerr al ? .F 7 0 afisare eroare din A4 cont label near endm < A CITIRE 7IR DE LUNGI9E DATA DIN FI7IER ? de la adresa data de pointerul de citire'scriere ? ----------------------------------------- c!tD'!- 1"c#o %"nle10lun$06u'' ? ,andle,lungime,tampon local cont clc mov a,,+f, ? functie citire fisier mov b!,,andle0 ? 2/ 7 indicator logic mov c!,lung ? numar octeti cititi mov d!,offset buff ? adresa "ona memorie int ;0, :nc cont ? .F 7 1 citire corecta tipHerr al ? afisare eroare din A4 cont label near endm A 7CRIERE IN FI7IER UN 7IR DE CARACTERE ? la adresa disc data de pointerul de citire scriere ?------------------------------------------ -c#D'!- 1"c#o %"nle10lun$06u'' ? ,andle,lungime,tampon local cont clc mov a,,51, ? functie scriere in fisier mov d!,offset buff ? adresa "ona memorie mov c!,lung ? numar octeti transferati mov b!,,andle0 ? 2/ 7 indicator logic fisier int ;0, :nc cont ? .F 7 1 scriere corecta tipHerr al ? afisare eroare din A4 cont label near endm A POBITIONARE POINTER DE CITIRE 7CRERE IN FI7IER ? adresa octet referitor la inceputul fisierului ./,$/ ? ----------------------------------------- l-eeE 1"c#o %"nle0t!p0lun$10lun$: local cont mov a,,5;, ? functie setare pointer cit'scr mov c!,lung0 ? adresa octet din fisier in ./,$/ mov d!,lung; mov b!,,andle ? 2/ 7 indicator logic fisier mov al,tip ? referinta inceput71, po"itia curenta 70, sfirsit7;? int ;0, :nc cont ? .F 7 1 operatie reusita tipHerr al ? tiparire cod eroare din A4 cont label near endm J A PROGRA9 PRINCIPAL A8888888888888888888888888 dosseg .model small .stacK ;<J ."t" numeHfis db F.#L&tudLPlaLfis.t!tF,1 ? numele fisierului ,andle dM 1 ? indicator logic fisier buf db <1,1,<1 dup (N) ? "ona tampon pentru dialog mes db F3ntroduceti 01 siruri de caractere#F,0+,01,FBF mes0 db 0+,01,F.ontinutul fisierului#F,0+,01,FBF err db 0+,01,Froare scr'cit fisier nr# BF .coe includedisclogi.inc ? definiri macro lucru cu fisiere start# mov a!,Odata mov ds,a! opHfis numeHfis,,andle ? desc,idere fisier tipHsir mes ? mesa: dialog mov c!,01 ? numar de rinduri citite l0# pus, c! citHsir buf ? citire rind tastatura scrHfis ,andle,0<,bufC; ? scriere rind in fisier pop c! loop l0 ?ciclu citire rinduri tipHsir mes0 ? mesa: afisare fisier lseeK ,andle,1,1,1 ? po"itionare inceput fisier mov c!,01 ? contor inregistrari citite l;# pus, c! citHfis ,andle,0<,bufC; ? citire din fisier 0< octeti tipHsir bufC; ? afisare octeti cititi pop c! loop l; ? ciclu citire de pe fisier clHfis ,andle ? inc,idere fisier mov a!,5.11, ? terminare program int ;0, end start ? adresa de lansare P