Sunteți pe pagina 1din 9

Noiunea de acces trebuie aplicat att pentru operaia de scriere, ct i pentru cea de

citire a datelor.
Poziia din/n care se face citirea/scrierea n cadrul fiierului este indicat
de un pointer. Accesul la datele nregistrate pe un purttor tehnic poate fi secvenial
sau direct, n funcie de modul n care se stabilete pointerul.
Accesul secvenial este posibil la toi purttorii tehnici de date i presupune nscrierea
nregistrrilor n ordinea furnizrii lor sau regsirea n ordinea n care au fost nscrise n support.
Pointerul de fiier avanseaz, n scriere i citire, de la o entitate (articol, bloc, linie sau
cmp) la alta. Dac pointerul se exprim prin deplasare fa prin deplasare, n octei, fa de
nceputul fiierului (la unele sisteme numrul relativ este stabilit de la unu: P*(Ak)=k).
La scriere, articolul Ak (numrul relativ k-1) se memoreaz pe poziia sa, celelalte k-1
articole anterioare putnd s nu existe (pe suport exist ns rezervat loc pentru ele). La citire,
articolul Ak (cu numrul relativ k-1, kn) este localizat direct i coninutul lui se transfer n
memoria intern.
Fiierele organizate secvenial, cu articole de lungime variabil, admit numai accesul
secvenial. Fiierele organizate secvenial, cu articole sau blocuri de lungime fix, admit att
accesul secvenial, ct i pe cel relativ. Acest lucru deriv din faptul c accesul relativ este
realizat de sistem printr-o deplasare secvenial fa de nceputul acestuia, deplasare care este
egal cu valoarea expresiei:
numr_relativ lungime_articol.
Asupra unui fiier se pot executa diverse operaii de prelucrare, numite i
de gestiune, care se mpart n operaii la nivel de fiier i la nivel de articol.
Operaiile la nivel de fiier se refer la aspecte ca: nscrierea fiierului n
[sub]directoare, validarea i interzicerea accesului la fiier (deschidere/nchidere), tergerea
fiierului din [sub]directoare (tergere) etc. Aceste operaii se regsesc, n
totalitate, la prelucrarea fiierelor pe discuri magnetice. n cazul purttorilor nereutilizabili,
singurele operaii care au sens sunt cele de deschidere/nchidere a fiierelor.
Operaiile la nivel de articol se refer la accesul la entitile de date ale
fiierului (articole, blocuri, linii sau cmpuri) n vederea prelucrrii lor. Privite sub
aspectul semnificaiei pentru utilizator, aceste operaii se refer la: nscrierea
iniial a entitilor pe purttorul tehnic (populare), actualizarea fiierului prin
includerea de noi entiti (adugare), modificarea valorilor unor cmpuri din anumite entiti
(modificare), eliminarea entitilor care nu mai sunt necesare (tergere), regsirea entitilor n
vederea satisfacerii unor cerine de informare (consultare). n programele C, operaiile de I/E
sunt realizate cu ajutorul unei mulimi de funcii specializate pentru cutare, scriere, citire etc.
n concluzie, dac din punctul de vedere al utilizatorului operaiile de prelucrare se
descriu relativ simplu, prin apeluri de funcii, realizarea efectiv a lor
de ctre sistemul de calcul este complex. n sistemul de operare MS-DOS sunt incluse funcii de
ntrerupere care, prin intermediul BIOS (Basic Input Output System), lanseaz anumite operaii
cu un echipament.
Din punct de vedere al reprezentrii datelor n suportul extern, se disting fiiere text, n
care toate datele sunt sub form ASCII (un caracter/octet) i fiiere binare, n care toate datele
sunt memorate n forma identic cu cea din memoria principal (MP).
Strns legat de lucrul cu cele dou tipuri de fiiere este modul n care se face transferul
datelor ntre memoria principal i suportul extern: transfer posibil cu conversie (n cazul
fiierelor text) i transfer fr conversie (n cazul fiierelor binare).

Indiferent de limbajul de programare folosit, operaiile necesare pentru prelucrarea


fiierelor sunt:
descrierea fiierului (crearea tabelei care memoreaz caracteristicile fiierului);
asignarea fiierului intern (numele logic) la unul extern (fizic);
deschiderea fiierului;
operaii de acces la date (articole);
nchiderea fiierului.
Pentru lucrul cu fiiere trebuie identificate tipurile acestora, metodele de organizare,
modurile de acces i tipurile de articole acceptate. Din punct de vedere al tipurilor de date, n C
exist un singur tip de fiiere: flux de octei (niruire de octei, fr niciun fel de organizare sau
semnificaie). Organizarea acestui flux de octei este secvenial. Accesul la fiiere se poate face
secvenial sau direct (cu excepia fiierelor standard, la care accesul este numai secvenial). n
bibliotecile limbajului exist funcii predefinite pentru prelucrarea fiierelor. Funciile de
prelucrare la nivel superior a fiierelor trateaz fluxul de octei acordndu-i o semnificaie
oarecare. Putem spune c din punct de vedere al prelucrrii, la acest nivel, ne putem referi la
fiiere text i fiiere binare.
Mod

Scop

Deschide un fiier existent pentru adugare la sfrit (extindere) sau l creeaz


dac nu exist. Este permis numai scrierea. Numai pentru fiiere text.

Deschide un fiier existent numai pentru citire

Suprascrie un fiier existent sau creeaz unul nou, permindu-se numai


operaia de scriere

a+

Deschide un fiier existent pentru adugare la sfrit (extindere) sau l creeaz


dac nu exist. Snt permise citiri i scrieri. Numai pentru fiiere text.

r+ Deschide un fiier existent pentru citire i scriere


w+

Suprascrie un fiier existent sau creeaz unul nou, permindu-se att citiri ct
i scrieri.

La opiunile de mai sus se poate aduga b pentru fiiere binare sau t pentru fiiere text.
Dac nu este prezent nici litera b nici litera t, modul considerat depinde de valoarea variabilei
_fmode : dac valoarea este O_BINARY, se consider fiier binar; dac valoarea este O_TEXT, se
consider fiier text. De obicei implicit este valoarea O_TEXT.

Modurile uzuale pentru deschiderea fiierelor snt prezentate n tabelul 2.

Tabelul 2. Moduri uzuale pentru deschiderea fiierelor


Operaia de gestiune

Fiiere text

Fiiere binare

Creare

wb

Consultare

rb

Actualizare
Creare i actualizare
Extindere

r+b
w+

rwb, w+b

nchiderea fiierelor se realizeaz prin apelul funciei fclose, care are urmtorul prototip:

int fclose(FILE* f);

Funcia nchide fiierul primit ca parametru.


Returneaz valoarea 0 n caz de succes sau -1, n caz de eroare.
nainte de nchiderea fiierului, snt golite toate zonele tampon asociate lui. Zonele tampon alocate
automat de sistem snt eliberate.

Revenirea la nceputul fiierului se realizeaz prin funcia rewind, cu prototipul:


void rewind(FILE *f);

Efect: poziionarea la nceputul fiierului f (care era deschis anterior), resetarea indicatorului de sfrit de
fiier i a indicatorilor de eroare (se nscrie valoarea 0). Dup apelul lui rewind poate urma o operaie de
scriere sau citire din fiier.
Testarea sfritului de fiier, se realizeaz prin apelul macrodefiniiei feof:

int feof(FILE* f);

Macro-ul furnizeaz valoarea indicatorului de sfrit de fiier asociat lui f. Valoarea acestui indicator este
setat la fiecare operaie de citire din fiierul respectiv. Valoarea ntoars este 0 ( fals) dac indicatorul are
valoarea sfrit de fiier i diferit de zero (adevrat) n caz contrar. Apelul lui feof trebuie s fie precedat

de apelul unei funcii de citire din fiier. Dup atingerea sfritului de fiier, toate ncercrile de citire vor
eua, pn la apelul funciei rewind sau nchiderea i redeschiderea fiierului .
Golirea explicit a zonei tampon a unui fiier se realizeaz prin apelul funciei fflush, care are urmtorul
prototip:
int fflush(FILE* f);

Dac fiierul f are asociat o zon tampon de ieire, funcia scrie n fiier toate informaiile din acesta, la
poziia curent. Dac fiierul are asociat o zon tampon de intrare, funcia l golete. n caz de succes
returneaz valoarea zero, iar n caz de eroare valoarea EOF (definit n stdio.h).
Exemplu: nainte de a citi un ir de caractere de la tastatur, zona tampon trebuie golit pentru a preveni
citirea unui ir vid (datorit unei perechi CR/LF rmase n zona tampon de la o citire anterioar a unei
valori numerice). tergerea se realizeaz prin apelul:
fflush(stdin);

Aflarea poziiei curente n fiier se realizeaz prin apelul uneia din funciile fgetpos sau ftell:
int fgetpos(FILE* f,fpos_t* poziie);

Dup apel, la adresa poziie se afl poziia pointerului de citire/scriere din fiierul f, ca numr relativ al
octetului curent. Primul octet are numrul 0. Valoarea returnat poate fi folosit pentru poziionare cu
funcia fsetpos. n caz de succes funcia ntoarce valoarea 0, iar n caz de eroare o valoare nenul i
seteaz variabila errno la valoarea EBADF sau EINVAL.
long ftell(FILE* f);

returneaz poziia n fiierul f a pointerului de citire/scriere n caz de succes sau -1L n caz contrar. Dac
fiierul este binar, poziia este dat n numr de octei fa de nceputul fiierului. Valoarea poate fi
folosit pentru poziionare cu funcia fseek.
Modificarea poziiei pointerului de citire/scriere se poate face prin poziionare relativ:
int fseek(FILE* f,long deplasare,int origine);

unde deplasare reprezint numrul de octei cu care se deplaseaz pointerul n fiierul f, iar origine
reprezint poziia fa de care se deplaseaz pointerul. Parametrul origine poate fi: SEEK_SET (0)
poziionare fa de nceputul fiierului; SEEK_CUR (1) poziionare fa de poziia curent; SEEK_END
(2) poziionare fa de sfritul fiierului. Funcia returneaz valoarea 0 n caz de succes (i uneori i n
caz de eec). Se semnaleaz eroare prin returnarea unei valori nenule numai n cazul n care f nu este
deschis.
Poziionarea absolut se face cu funcia:

int fsetpos(FILE* f,const fpos_t poziie);

Pointerul de citire/scriere se mut n fiierul f la octetul cu numrul indicat de parametrul poziie (care
poate fi o valoare obinut prin apelul lui fgetpos).
Ambele funcii reseteaz indicatorul de sfrit de fiier i anuleaz efectele unor eventuale apeluri
anterioare ale lui ungetc asupra acelui fiier.
Redenumirea sau mutarea unui fiier existent se poate realiza prin apelul funciei rename, care are
urmtorul prototip:
int rename(const char* n_vechi,const char* n_nou);

unde n_vechi reprezint vechiul nume al fiierului, iar n_nou reprezint numele nou.
Dac numele vechi conine numele discului (de exemplu C:), numele nou trebuie s conin acelai nume
de disc. Dac numele vechi conine o cale, numele nou nu este obligat s conin aceeai cale. Folosind o
alt cale se obine mutarea fiierului pe disc. Folosind aceeai cale (sau nefolosind calea) se obine
redenumirea fiierului. Nu snt permise wildcard-uri (?, *) n cele dou nume.
n caz de succes se ntoarce valoarea 0. n caz de eroare se ntoarce -1 i errno primete una din
valorile: ENOENT nu exist fiierul, EACCES nu exist permisiunea pentru operaie sau ENOTSAM
dispozitiv diferit (mutarea se poate face doar pe acelai dispozitiv).
tergerea unui fiier existent se poate realiza prin apelul funciei unlink, prezentat anterior, sau remove,
care are urmtorul prototip:
int remove(const char* cale);

unde cale reprezint specificatorul fiierului (trebuie s fie nchis).


Citirea dintr-un fiier binar se realizeaz prin apelul funciei fread, care are urmtorul prototip:
size_t fread(void* ptr,size_t dim,size_t n,FILE* f);

Funcia citete din fiierul f, de la poziia curent, un numr de n entiti, fiecare de dimensiune dim, i le
depune, n ordinea citirii, la adresa ptr. fread returneaz numrul de entiti citite. n total se citesc, n caz
de succes, n*dim octei. n caz de eroare sau cnd se ntlnete sfritul de fiier, funcia returneaz o
valoare negativ sau 0; size_t este definit n mai multe header-e (ntre care stdio.h) i este un tip de dat
folosit pentru a exprima dimensiunea obiectelor din memorie. Este compatibil cu tipul unsigned.

Exemplu:
struct complex {int x,y} articol;
FILE * f_complex;
if(f_complex=fopen("NR_COMPL.DAT", "rb")

fread(&articol,sizeof(articol),1,f_complex);
else printf("Fisierul nu poate fi deschis");

n exemplul anterior se deschide un fiier binar din care se citete un articol de tip struct complex care se
depune n variabila articol.
Scrierea ntr-un fiier binar se poate realiza prin apelul funciei fwrite, care are urmtorul
prototip:
size_t fwrite(const void* ptr,size_t dim,size_t n,FILE* f);

Funcia scrie n fiierul f, ncepnd cu poziia curent, un numr de n entiti contigue, fiecare de
dimensiune dim, aflate n memorie la adresa ptr; fwrite returneaz numrul entitilor scrise cu succes. n
caz de eroare se returneaz o valoare negativ.

Exemplu:
struct complex {int x,y} articol;
FILE *pf;
pf=fopen("NR_COMPL.DAT","wb");
fwrite(& articol,sizeof (articol),1,pf);

Exemplul anterior creeaz un fiier binar nou n care scrie o secven de octei coninnd reprezentarea
binar a unei date de tip struct complex.

Fiiere text.
Lucrul cu fiiere text n limbajul C presupune parcurgerea urm toarelor etape:
1. Deschiderea fiierului
2. Prelucr ri asupra fiierului (citiri, scrieri)
3. nchiderea fiierului
1. Deschiderea unui fiier se realizeaz cu funcia fopen. n continuare este prezentat prototipul
funciei fopen:
FILE *fopen(char *nume_fis,char *mod), unde nume_fis este un ir de caractere
care conine numele fiierului iar mod este un ir de caractere care va preciza
operaiile ce vor fi efectuate asupra fiierului precum i tipul de fiier.
Dac operaia de deschidere a fiierului a decurs corect, pointerul ntors de fopen este diferit de
NULL. Dac , din diverse motive, deschiderea nu s-a putut efectua corect, fopen va ntoarce
NULL, fapt ce trebuie testat nainte de a trece la alte prelucrri.
Ex:
FILE *fis_in;
fis_in=fopen(in.txt,rt);
if(fis_in==NULL)

{
printf(Eroare la deschiderea fisierului in.txt );
getch();
}
2 Prelucr ri asupra fiierului. Operaii de citire, scriere.
a) Citirea din fiier
a1) Citirea unui caracter. Aceasta se realizeaz utiliz nd funcia fgetc.
Prototipul: int fgetc(FILE *f)
Ex:
char c;
FILE *fis_in;
//
c=fgetc(fis_in);
//
Ex: Afiarea coninutului unui fiier text
#include<stdio.h>
#include<conio.h>
void main(void)
{
FILE *fin;
char c;
clrscr();
fin=fopen("in.txt","rt"); //deschiderea fisierului, pentru citire
if(fin==NULL) //se testeaza daca deschiderea fisierului s-a efectuat cu succes
{
printf("Eroare la deschiderea fisierului in.txt");
getch();
return;
}
while((c=fgetc(fin))!=EOF) //citirea din fisier
putc(c,stdout); //afisarea caracterului citit din fisier
fclose(fin); //inchiderea fisierului
getch();
}
a2) Citirea unui ir de caractere. Aceasta se realizeaz utiliz nd funcia fgets.
Prototipul: char* fgets(char *s, int n, FILE *f)
Ex:
char sir[50];
FILE *fis_in;
// .
fgets(sir,50,fis_in); //citirea in tabloul s a maxim 50 caractere
// .
a3) Funcia fscanf. Aceast funcie este similar funciei scanf, cu precizarea c
datele nu sunt citite de la tastatur , ci dintr-un fiier. Funcia fscanf returneaz
num rul de valori citite din fiier.
Prototipul: int fscanf(FILE *f, char *format, )

Dac primul argument al funciei este stdin atunci datele vor fi citite din fiierul
standard de intrare (tastatura).
Ex:
int n,m;
FILE *fis_in;
//
fscanf(fis_in,%d%d,&n,&m);
// .
b) Scrierea n fiier
b1) Scrierea unui caracter ntr-un fiier. Aceasta se realizeaz utiliz nd funcia
fputc.
Prototipul: int fputc(int c, FILE *f);
Ex:
char c;
c=a;
FILE *fis_out;
// .
fputc(c,fis_out);
// .
Ex: Copierea coninutului unui fiier de intrare ntr-un fiier de ieire.
#include<stdio.h>
#include<conio.h>
void main(void)
{
FILE *fin,*fout;
char c;
clrscr();
fin=fopen("in.txt","rt"); //deschiderea fisierului de intrare, pentru citire
if(fin==NULL) //se testeaza daca deschiderea fisierului s-a efectuat cu succes
{
printf("Eroare la deschiderea fisierului in.txt");
getch();
return;
}
fout=fopen("out.txt","wt"); //deschiderea fisierului de iesire, pentru scriere
if(fout==NULL) //se testeaza daca deschiderea fisierului s-a efectuat cu succes
{
printf("Eroare la deschiderea fisierului out.txt");
getch();
return;
}
while((c=fgetc(fin))!=EOF)
fputc(c,fout); //scrierea in fisierul de iesire, a caracterului citit din fisierul de intrare
fclose(fin); //inchiderea fisierului de intrare
fclose(fout); //inchiderea fisierului de iesire
printf("Copierea fisierului in.txt in fisierul out.txt s-a realizat cu succes");

printf("\nApasati o tasta pentru a reveni in program !");


getch();
}
b2) Scrierea unui ir de caractere ntr-un fiier. Aceasta se realizeaz utiliz nd
funcia fputs.
Prototipul: fputs (const char *s, FILE *f)
Ex:
char sir[100];
FILE *fis_out;
// .
strcpy(sir,Acest sir va fi scris in fisier);
fputs(sir,fis_out);
// ..
b3) Functia fprintf.
Prototipul: int fprintf(FILE *f, char *format, )
Dac primul argument al funciei fprintf este stdout atunci datele vor fi scrise la
ieirea standard(monitor)
Ex:
int n,m;
n=2;
m=4;
FILE *fis_out;
// .
fprintf(fis_out,%d %d,n,m);
// .
3. nchiderea fiierului se realizeaz cu funcia fclose.
Prototipul: int fclose(FILE *f)
Ex:
FILE *fis_in;
// .
fclose(fis_in);
// .