Sunteți pe pagina 1din 10

Lucrarea 7

Lucrul cu Fiiere n Windows


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.

S-ar putea să vă placă și