n aceast lucrare o s ne concentrm pe acele apeluri sistem pentru care exist funcii C corespondente. Bibliotecile C "run-time" au ns urmtoarele limitri pentru lucrul cu fiiere: a) aplicaiile care folosesc biblioteca static single-fir !"BC.!"B) pot desc#ide simultan maxim $% de descriptori de fiiere& apel'nd direct sistemul de operare i maxim () de fluxuri. b) *plicaiile care folosesc fie biblioteca static multifir!"BC+,.!"B) sau biblioteca dinamic multifir+-.C/,.0!!) au o limit de (1$ fiiere i de %) fluxuri. ncercarea de a nclca restriciile de mai sus conduce la euarea programului. Funcii utile, pe categorii: ". 2uncii pentru crearea& tergerea i manipularea fiierelor precum i pentru setarea i 3erificarea drepturilor de acces la fiier. 2unciile din aceast categorie& le putem clasifica n: a) funcii care lucrea4 cu "file descriptor": 5loc6ing- bloc#ea4 o 4on dintr-un fiier. 5setmode - stabilete modul de interpretare a fiierului binar sau text). 5fstat&5fstati$% - ntoarce informaii despre un fiier desc#is. 5c#si4e - modific dimensiunea unui fiier. 5filelengt#& 5filelengt#i$% - ntoarce dimensiunea unui fiier. 5isatt7 - determin dac este 3orba de un dispo4iti3 caracter. b)funcii care lucrea4 cu cale i nume: 5access& 58access- 3erific drepturile de acces la un fiier. 5c#mod& 58c#mod- modific drepturile de acces la un fiier. 5fullpat#& 58fullpat# - creea4 o cale absolutcomplet) pornind de la o cale relati3. 5ma6epat#& 58ma6epat# - creea4 o cale din componente. 5m6temp& 58m6temp - creea4 un fiier cu nume unic. remo3e& 58remo3e - terge un fiier. rename& 58rename - redenumete un fiier. 5splitpat#& 58splitpat# - "rupe" o cale n componente. 5stat& 58stat& 5stati$%& 58stati$% - obine informaii despre un fiier. 5umas6 - setea4 ablonul pentru drepturile de acces ale fiierelor create de program. 5unlin6& 58unlin6 - terge un fiier. "". 2uncii de "9) pentru fluxuri. fsopen- desc#iderea unui flux cu parta:area fiierului. clearerr - terge indicatorul de eroare pentru un flux. fclose& 5fcloseall - nc#ide un flux9 nc#ide toate fluxurile n afar de cele standard. 5fdopen& 58fdopen - asocia4 un flux cu un descriptor desc#is anterior. feof - testea4 sf'ritul fiierului. ferror- testea4 erorile dintr-un flux. 5fileno - ntoarce descriptorul unui flux. fread - citete date dintr-un flux. fsee6 - mut pointerul de fiier ntr-o locaie specificat. ftell - ntoarce po4iia curent a unui pointer de fiier. f8rite - scrie date ntr-un flux. """. 2uncii de "9; de ni3el sc4ut lucrea4 cu descriptori de fiier). 5close- nc#ide un fiier. 5creat& 58creat- creea4 un fiier. 5eof- testea4 sf'ritul unui fiier. 5lsee6& 5lsee6i$% - repo4iionea4 pointerul de fiier ntr-o locaie dat. 5read- citete date din fiier. 5sopen& 58sopen- desc#ide un fiier parta:at. 5tell& 5telli$% - ntoarce po4iia pointerului de fiier. 58rite - scrie date ntr-un fiier. n continuare& o s ncercm s 3edem utilitatea c'tor3a funcii din cele nirate mai sus. 2ie urmtoarea problem: "-e cere s se scrie un program pentru gestionarea conturilor bancare care s poat fi utili4at simultan de la mai multe staii de lucru." 0e fapt problemele apar datorit utili4rii simultane i pentru a argumenta& imaginai-3 urmtoarea situaie: la o staie -< se face o retragere din contul x. =rogramul mai nt'i 3a citi soldul contului& dar n acelai timp la staia -( altcine3a face o retragere din acelai cont. 0e asemenea programul care rulea4 pe staia -( 3a citi soldul contului& care 3a fi acelai cu cel citit de staia -< . 0up care staia -< 3a scdea din soldul citit suma retrasa i 3a scrie noul sold re4ultat. !ucru pe care-l 3a face c3asi-simultan i staia -(. =entru urmtoarea 3ariant de program o s ne folosim de funciile care lucrea4 cu fluxuri. 2uncia principal a programului o s conin un fel de meniu care o s ne permit s apelm celelalte funcii ale programului: 3oid main3oid) > c#ar fisier?@A"banca.dat"B int tastaB do> printf"Cni-iesire " "c-creare fisier " "a-adaugare cont " "d-depunere " "l- listare " )B 8#ile D56b#it) )B tastaAgetc#e)B tastaAtolo8ertasta)B printf"Cn")B s8itc#tasta) > case EcE: crearefisier)B brea6B case EaE: adaugafisier)B brea6B case EdE: depunefisier)B brea6B case ElE: listarefisier)B brea6B F F8#iletastaDAEiE)B F Gtili4atorului i se afiea4 o list de opiuni i i se cere s apese tasta care s-l duc la opiunea dorit. =rima opiune este creare fiier i nu ar trebui s fie lsat la ndem'na utili4atorului obinuit deoarece are ca efect distrugerea 3ec#iului fiier& n ca4 c acesta exist . Ca s simplificm& o s gestionm structuri de date de forma: t7pedef struct> int numarB int soldB FcontB 0e acum n colo o s ncercm s ne g'ndim i ce ar putea sau ar a3ea 3oie s fac ceilali utili4atori. n ca4ul acesta& deoarece nu a3em de g'nd dec't s crem fiierul dup care s-l nc#idem& nu 3om restr'nge drepturile celorlali utili4atori. *rgumentul 5-H50IJKJ; al funciei 5fsopen are ca efect desc#iderea n ca4ul nostru crearea) fiierului fr a restr'nge drepturile celorlali asupra acestuia. 3oid crearec#arL nume) > 2"!I LfB iffA5fsopennume&"8b"&5-H50IJKJ;))DAJG!!) > fclosef)B printf"creat cu succes")B F else printf"blocatCn")B F Grmtoarea operaiune pe care o implementm este cea de desc#idere cont. *ceasta are ca efect adugarea unei noi nregistrri n fiier. Ixist pericolul ca la alt calculator s se fac acelai lucru . ?ntrebare: 0e ce este un pericolM @. 0e aceea o s "lum" dreptul celorlali de a scrie n fiier. Cam mult& dar asta ne ofer 5fsopen nu are ce3a de genul 0IJK*==IJ0). 3oid adaugac#arL nume) > cont cB 2"!I LfB 8#ile6b#it)) getc#)B iffA5fsopennume&"ab"&5-H50IJKN/))DAJG!!) > printf"numar cont:")B scanf"Od"&Pc.numar)B getc#ar)B c.soldA)B f8ritePc&si4eofc)&<&f)B printf"Cnapasati o tasta pentru a continuaCn")B 8#ile D56b#it) )B getc#)B fclosef)B F else printf"blocatCn")B F =artea de la final: printf"Cnapasati o tasta pentru a continuaCn")B 8#ile D56b#it) )B getc#)B fclosef)B are scopuri pur educati3e. . permite s obser3ai ce se nt'mpl n ceea ce pri3ete drepturile de acces ale "celorlali") atunci c'nd programul execut di3erse aciuni: ateapt s apsai o tast nainte de a nc#ide fiierul ceea ce are ca efect anularea restriciilor. n continuare o s ne ocupm de depunere extragerea se tratea4 la fel& din punct de 3edere al drepturilor de lucru cu fiierul). !a depunere trebuie s inem cont doar de faptul c cine3a poate depune sau extrage sume din acelai cont. Ju ne deran:ea4 dac se lucrea4 cu alte conturi sau se adaug nregistrri noi. ; s folosim funcia 5loc6ing care ne permite s blocm& complet citire i scriere)& o 4on din fiier. *ceast funcie lucrea4 numai cu "descriptor" de fiier i funcia fileno ne a:ut s-l obinem. 3oid depunec#arL nume) > cont c&pB 2"!I LfB if6b#it)) getc#)B iffA5fsopennume&"rQb"&5-H50IJKJ;))DAJG!!) > printf"numar cont:")B scanf"Od"&Pc.numar)B printf"3aloare depunere:")B scanf"Od"&Pc.sold)B 8#ilefreadPp&si4eofp)&<&f)PPp.numar DAc.numar))B ifp.numarAAc.numar) > int descriptorAfilenof)B fsee6f&-int)si4eofp)&-IIR5CG/)B if5loc6ingdescriptor&!R5JB!CR&si4eofp))AA)) > p.soldQAc.soldB f8ritePp&si4eofp)&<&f)B fsee6f&-int)si4eofp)&-IIR5CG/)B printf"Cnapasati o tasta pentru a continuaCn")B 8#ile D56b#it) )B getc#)B 5loc6ingdescriptor&!R5GJ!CR&si4eofp))B F else printf"contul este utili4atCn")B F else printf"cont inexistentCn")B fclosef)B F else printf"fisier blocatCn")B F "mplementarea de mai sus are o problem : deoarece funciile cu fluxuri& din moti3e de optimi4are& folosesc 4one tampon se poate nt'mpla ca scrierea i citirea poate eua& dei n 4ona cu care se lucrea4 nu exist nici o blocare& dar exist o 4on blocat n apropiere. n fine& dac tot am a:uns p'n aici s pre4entm i ultima operaiune& care este benign n ceea ce pri3ete restr'ngerea drepturilor celorlali. 3oid listarec#arL nume) > cont cB 2"!I LfB iffA5fsopennume&"rb"&5-H50IJKJ;))DAJG!!) > int octetiB 8#ileoctetiAfreadPc&si4eofc)&<&f)) printf"Cncont:Od sold:Od"&c.numar&c.sold)B printf"Cnapasati o tasta pentru a continuaCn")B int eroareB iferoareAferrorf)) printf"eroare Os"&strerroreroare))B 8#ile D56b#it) )B getc#)B fclosef)B F else printf"blocatCn")B F *cum s re4ol3m mcar o parte din probleme i o s pre4entm implementarea aceleiai probleme& dar folosind funcii de ni3el sc4ut: Sinclude Tfcntl.#U Sinclude Tio.#U Sinclude Ts7s9t7pes.#U Sinclude Ts7s9stat.#U Sinclude Ts7s9loc6ing.#U Sinclude "stdio.#" Sinclude "conio.#" Sinclude "s#are.#" Sinclude "stdlib.#" Sinclude "string.#" Sinclude Terrno.#U t7pedef struct> int numarB int soldB F contB 3oid crearec#arL nume) > int fB iffA5creat nume& 5-5"/I*0 V 5-5"N/",I ))DA-<) > 5closef)B printf"creat cu succes")B F else printf"blocatCn")B F 3oid adaugac#arL nume) > cont cB int fB iffA5sopennume&5;5*==IJ0V5;5N/;J!KV 5;5C/I*,V 5;5B"J*/K&5-H50IJKN/& 5-5"N/",I ))DA-<) > printf"numar cont:")B scanf"Od"&Pc.numar)B getc#ar)B c.soldA)B int octetiA58ritef&Pc&si4eofc))B ifoctetiAA-<) > printf"eroare ")B iferrnoAAIB*02) printf"in3alid file #")B iferrnoAAIJ;-=C) printf"spatiu")B F else > printf"Cnapasati o tasta pentru a continuaCn")B 8#ile D56b#it) )B getc#)B F 5closef)B F else printf"blocatCn")B F 3oid depunec#arL nume) > cont c&pB int fB iffA5sopennume&5;5B"J*/KV5;5/*J0;+V5;5/0N/&5-H50IJKJ;))D A-<) > printf"numar cont:")B scanf"Od"&Pc.numar)B printf"3aloare depunere:")B scanf"Od"&Pc.sold)B 8#ilereadf&Pp&si4eofp))PPp.numar DAc.numar))B ifp.numarAAc.numar) > 5lsee6f&-int)si4eofp)&-IIR5CG/)B if5loc6ingf&!R5JB!CR&si4eofp))AA)) > p.soldQAc.soldB 8ritef&Pp&si4eofp))B 5lsee6f&-int)si4eofp)&-IIR5CG/)B printf"Cnapasati o tasta pentru a continuaCn")B 8#ile D56b#it) )B getc#)B 5loc6ingf&!R5GJ!CR&si4eofp))B F else printf"contul este utili4atCn")B F else printf"cont inexistentCn")B 5closef)B F else printf"fisier blocatCn")B F 3oid listarec#arL nume) > cont cB int fB iffA5sopennume&5;5B"J*/KV5;5/0;J!K&5-H50IJKJ;))DA-<) > 8#ilereadf&Pc&si4eofc))) printf"Cncont:Od sold:Od"&c.numar&c.sold)B printf"Cnapasati o tasta pentru a continuaCn")B 8#ile D56b#it) )B getc#)B 5closef)B F else printf"blocatCn")B F 3oid main3oid) > c#ar fisier?@A"banca.dat"B int tastaB do> printf"Cni-iesire " "c-creare fisier " "a-adaugare cont " "d-depunere " "l- listare " )B 8#ile D56b#it) )B tastaAgetc#e)B tastaAtolo8ertasta)B printf"Cn")B s8itc#tasta) > case EcE: crearefisier)B brea6B case EaE: adaugafisier)B brea6B case EdE: depunefisier)B brea6B case ElE: listarefisier)B brea6B F F8#iletastaDAEiE)B F
*cest program repre4int ns numai o platform& put'nd fi foarte mult corectat i mbuntit. Probleme propuse. <. +odificai programul de mai sus astfel nc't s permit un ni3el mai mare de concuren. (. "mplementai un ser3iciu de pot electronic& folosind numai fiiere parta:ate pentru comunicare. Gn program are dreptul numai s trimit mesa:e& iar altul are dreptul s le citeasc& s le tearg i s le modifice nu dup ce le-a ters). W. -ortai un fiier c't mai eficient& in'nd cont de faptul c bufferul controlerului este de n RB. %. -criei o aplicaie care s efectue4e operaiile de inserare& tergere i modificare asupra unui fiier sortat dup un anumit criteriu& in'nd cont de faptul c bufferul controlerului este de n RB.